带有 join_table 和 has_many 的模型的路由错误:在 RailsAdmin 中 [英] Routing Error for a model with a join_table and has_many :through in RailsAdmin
问题描述
所以我有 3 个模型:category
、product
、category_products
.
So I have 3 models: category
, product
, category_products
.
这是我的category.rb
attr_accessible :name
has_many :category_products do
def with_products
includes(:product)
end
end
has_many :products, :through => :category_products
这是我的product.rb
attr_accessible :name, :description, :price, :vendor_id, :image, :category_ids
belongs_to :vendor
has_many :category_products do
def with_categories
includes(:category)
end
end
has_many :categories, :through => :category_products
这是我的category_product.rb
attr_accessible :product_id, :category_id, :purchases_count
belongs_to :product
belongs_to :category
validates_uniqueness_of :product_id, :scope => :category_id
这是我的routes.rb
mount RailsAdmin::Engine => '/admin', :as => 'rails_admin'
resources :categories
resources :vendors do
resources :products
end
authenticated :user do
root :to => 'home#index'
end
root :to => "home#index"
devise_for :users
resources :users
当我在查看 RailsAdmin 时单击 Categories
时,出现此错误:
When I click on Categories
when I am viewing RailsAdmin, I get this error:
ActionController::RoutingError at /admin/category
Message No route matches {:action=>"show", :model_name=>"category_product", :id=>nil, :controller=>"rails_admin/main"}
当我点击 Category Products
ActiveRecord::StatementInvalid at /admin/category_product
Message SQLite3::SQLException: no such column: category_products.desc: SELECT "category_products".* FROM "category_products" ORDER BY category_products. desc LIMIT 20 OFFSET 0
RailsAdmin 中用于我的其他正常"(即非 HMT)模型的所有其他链接都有效.
All other links within RailsAdmin for my other 'normal' (i.e. non HMT) models work.
这可能是什么原因造成的?
What could be causing this?
谢谢.
编辑 1
值得一提的是,以下是我在 Rails Admin 中单击类别"时的日志:
For what it's worth, here are the logs when I click on 'Categories' inside of Rails Admin:
CodeRay::Scanners could not load plugin nil; falling back to :text
CodeRay::Scanners could not load plugin nil; falling back to :text
Started GET "/admin/category?_pjax=%5Bdata-pjax-container%5D" for 127.0.0.1 at 2012-12-20 22:23:38 -0500
Processing by RailsAdmin::MainController#index as HTML
Parameters: {"_pjax"=>"[data-pjax-container]", "model_name"=>"category"}
Category Load (0.3ms) SELECT "categories".* FROM "categories" LIMIT 6
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Category Load (0.2ms) SELECT "categories".* FROM "categories" ORDER BY categories.id desc LIMIT 20 OFFSET 0
CategoryProduct Load (0.2ms) SELECT "category_products".* FROM "category_products" WHERE "category_products"."category_id" = 2
Rendered /.rvm/gems/ruby-1.9.3-p194@apt-605/gems/rails_admin-0.3.0/app/views/rails_admin/main/index.html.haml within layouts/rails_admin/pjax (29.4ms)
Completed 500 Internal Server Error in 43ms
CodeRay::Scanners could not load plugin nil; falling back to :text
CodeRay::Scanners could not load plugin nil; falling back to :text
Started GET "/admin/category" for 127.0.0.1 at 2012-12-20 22:23:40 -0500
Processing by RailsAdmin::MainController#index as HTML
Parameters: {"model_name"=>"category"}
Category Load (0.3ms) SELECT "categories".* FROM "categories" LIMIT 6
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Category Load (0.2ms) SELECT "categories".* FROM "categories" ORDER BY categories.id desc LIMIT 20 OFFSET 0
CategoryProduct Load (0.2ms) SELECT "category_products".* FROM "category_products" WHERE "category_products"."category_id" = 2
Rendered /.rvm/gems/ruby-1.9.3-p194@apt-605/gems/rails_admin-0.3.0/app/views/rails_admin/main/index.html.haml within layouts/rails_admin/application (30.5ms)
Completed 500 Internal Server Error in 251ms
编辑 2
这是错误的完整跟踪要点.我正在使用 gem better_errors,所以跟踪看起来不像标准的 Rails 跟踪错误.但是数据是一样的.
Here is a gist of the full trace of the error. I am using the gem better_errors, so the trace doesn't look like a standard Rails trace error. But the data is the same.
编辑 3
这是我的 3 个模型的架构:
This is the schema for my 3 models:
CategoryProducts
# == Schema Information
#
# Table name: category_products
#
# product_id :integer
# category_id :integer
# purchases_count :integer default(0)
# created_at :datetime not null
# updated_at :datetime not null
类别
# == Schema Information
#
# Table name: categories
#
# id :integer not null, primary key
# name :string(255)
# created_at :datetime not null
# updated_at :datetime not null
产品
# == Schema Information
#
# Table name: products
#
# id :integer not null, primary key
# name :string(255)
# description :string(255)
# price :float
# vendor_id :integer
# created_at :datetime not null
# updated_at :datetime not null
# image :string(255)
请注意,CategoryProduct
没有主键字段.是这个问题吗?
Notice that CategoryProduct
doesn't have a primary key field. Is that the issue?
推荐答案
检查所有 CategoryProduct 对象是否有外键:category_id 和 product_id.
Check all the CategoryProduct objects have foreign keys: category_id and product_id.
CategoryProduct.all.each {|c| raise("Repair #{c.id}") unless c.category && c.product}
12 月 21 日更新:
我如何使用 Category、Product 和 CategoryProduct 安装全新的 Rails 3.2.9.模型的关系代码相同,RailsAdmin 使用默认设置.
How i've installed brand new Rails 3.2.9 with Category, Product and CategoryProduct. Model's relationship code is identical, RailsAdmin with default settings.
而且它没有任何问题!
我决定检验我的假设.我想也许当您从 HABTM 转到 HM2HM 时,您已经错过(忘记)重新建立 CategoryProduct 的键列 ID,它现在不仅仅是一个连接模型,而是一个独立的实体.
I decided to test my hypothesis. I think maybe when you went from the HABTM to the HM2HM you have missed (forgot) to reestablish key column ID for CategoryProduct which is now not just a join-model, but an independent entity.
所以,路由错误如下:
No route matches {:action=>"show", :model_name=>"category_product", :id=>nil, :controller=>"rails_admin/main"}
可能是缺少 id 的结果.
好吧,我手动禁用了 CategoryProduct 的 id 字段(def id;nil;end).
Well I disabled CategoryProduct's id field manually (def id; nil; end).
是的:
No route matches {:action=>"show", :model_name=>"category_product", :id=>nil, :controller=>"rails_admin/main"}
这篇关于带有 join_table 和 has_many 的模型的路由错误:在 RailsAdmin 中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!