【发布时间】: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 < 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