在RailsAdmin中具有join_table和has_many:through的模型的路由错误(Routing Error for a model with a join_table and has_many :through in RailsAdmin)

所以我有3个型号: 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时,出现此错误:

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)模型。

可能是什么导致了这个?

谢谢。

编辑1

对于它的价值,这里是我点击Rails管理员内部的“类别”时的日志:

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跟踪错误。 但数据是一样的。

编辑3

这是我的3个模型的架构:

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

Category

# == Schema Information # # Table name: categories # # id :integer not null, primary key # name :string(255) # created_at :datetime not null # updated_at :datetime not null

Product

# == 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没有主键字段。 这是问题吗?

So I have 3 models: category, product, category_products.

This is my category.rb

attr_accessible :name has_many :category_products do def with_products includes(:product) end end has_many :products, :through => :category_products

This is my 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

This is my 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

This is my 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

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"}

I also get this error when I click on 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

All other links within RailsAdmin for my other 'normal' (i.e. non HMT) models work.

What could be causing this?

Thanks.

Edit 1

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

Edit 2

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.

Edit 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

Category

# == Schema Information # # Table name: categories # # id :integer not null, primary key # name :string(255) # created_at :datetime not null # updated_at :datetime not null

Product

# == 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)

Notice that CategoryProduct doesn't have a primary key field. Is that the issue?

最满意答案

检查所有CategoryProduct对象是否有外键:category_id和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具有默认设置。

它没有任何问题!

我决定测试我的假设。 我想也许当你从HABTM转到HM2HM时,你已经错过了(忘了)重新建立CategoryProduct的关键列ID,而ClassProduct现在不仅仅是一个连接模型,而是一个独立的实体。

所以,路由错误如:

No route matches {:action=>"show", :model_name=>"category_product", :id=>nil, :controller=>"rails_admin/main"}

可能是遗失id的结果。

我手动禁用了CategoryProduct的id字段(def id; nil; end)。

是的,它是:

No route matches {:action=>"show", :model_name=>"category_product", :id=>nil, :controller=>"rails_admin/main"}

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}

Dec 21 update:

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.

And it works with no any problems!

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.

So, routing error like:

No route matches {:action=>"show", :model_name=>"category_product", :id=>nil, :controller=>"rails_admin/main"}

can be result of missing id.

Well I disabled CategoryProduct's id field manually (def id; nil; end).

and yes it is:

No route matches {:action=>"show", :model_name=>"category_product", :id=>nil, :controller=>"rails_admin/main"}

更多推荐