【问题标题】:Uninitialized constant many_to_many association in Rails4Rails4中未初始化的常量many_to_many关联
【发布时间】:2016-01-12 08:39:34
【问题描述】:

我有 2 个模型与关联 many_to_many。创建品牌时出现错误:

Admin::Brands#new 中的名称错误 显示 /.../app/views/admin/brands/_form.html.slim 第 3 行引发的位置: 未初始化的常量 Brand::BrandCatalog

我做错了什么?

#app/models/category.rb
class Category < ActiveRecord::Base
  has_many :brand_catalogs
  has_many :brands, through: :brand_catalogs
end

#app/models/brand.rb
class Brand < ActiveRecord::Base
  has_many :brand_catalogs
  has_many :categories, through: :brand_catalogs
end

#app/models/brandcatalog.rb
class BrandCatalog < ActiveRecord::Base
    belongs_to :category
    belongs_to :brand
end

迁移

#db/migrate/20151230092013_create_brand_catalogs.rb
class CreateBrandCatalogs < ActiveRecord::Migration
  def change
    create_table :brand_catalogs, id: false do |t|
      t.integer :category_id
      t.integer :brand_id
    end

    add_index :brand_catalogs, [:category_id, :brand_id]
  end
end

品牌控制器

#app/controllers/admin/brands_controller.rb
class Admin::BrandsController < Admin::BaseController
  before_action :require_login
  load_and_authorize_resource
  before_action :load_brand, only: [:edit, :update, :destroy]

  def index
    @brands = Brand.all
  end

  def new
    @brand = Brand.new
  end

  def edit
  end

  def create
    @brand = Brand.create(brand_params)
    if @brand.save
     redirect_to admin_brands_path, notice: 'Brand was successfully created.'
    else
     render :new, notice: 'Something wrong!'
   end

  def update

  end

  def destroy
  end

  private
    def load_brand
      @brand = Brand.find(params[:id])
    end

    def brand_params
      params.require(:brand).permit(:title, {category_ids: []})
    end
end

品牌形式

# views/admin/brands/_form.html.slim
= bootstrap_form_for [:admin, @brand] do |f|
  div class='form-group'
    = f.collection_check_boxes(:category_ids, Category.all, :id, :title)

  div class='form-group'
    = f.text_field :title, class: 'form-control'

  = f.submit 'Save', class: 'btn btn-success'

【问题讨论】:

  • 如果你为brand_catalogs 表设置了id: false 那么:through 关系有什么用?
  • 使用has_and_belongs_to_many 或将id 添加到您的CreateBrandCatalogs &lt; ActiveRecord::Migration
  • 感谢您的回答。我从brand.rb中删除了through: :brand_catalogs,它解决了这个问题。但现在保存品牌时出现新错误:ActiveModel::MissingAttributeError in Admin::BrandsController#create can't write unknown attribute "brand_id"
  • @OlegSobchuk,我在 CreateBrandCatalogs

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

尝试将您的 #app/models/brandcatalog.rb 文件重命名为 brand_catalog.rb。 Modelnames 需要具有匹配的文件名,但带有下划线而不是驼峰式。

例如,一个名为ThisIsMyModel 的模型应该有一个名为this_is_my_model.rb 的文件

【讨论】:

  • 没错!我怎么会错过)。现在控制器不保存品牌。但那是另一回事了
  • 那是因为你没有保存它,你只是用new初始化它。尝试添加@brand.save@brand = Brand.create(brand_params)。您可能应该在保存时添加一些 if 语句,以防某些参数有问题。
  • 我更正了有问题的控制器。但没有结果。
  • 现在您尝试先创建对象然后保存它。您应该首先使用@brand = Brand.new(brand_params) 对其进行初始化,然后运行if @brand.save。如果未存储,则保存时可能会出现一些错误。如果您运行save! 而不是save,应用程序将因错误而停止,您应该能够在控制台中看到它。
  • 好的。我现在可以看到错误ActiveRecord::RecordInvalid in Admin::BrandsController#create Validation failed: Brand catalogs is invalid, Brand catalogs is invalid
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多