带有 join_table 和 has_many 的模型的路由错误:在 RailsAdmin 中 [英] Routing Error for a model with a join_table and has_many :through in RailsAdmin

查看:42
本文介绍了带有 join_table 和 has_many 的模型的路由错误:在 RailsAdmin 中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有 3 个模型:categoryproductcategory_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆