1

アイテムとカテゴリの間に多対多の関係を作成する 2 つのテーブル間に HABTM 関係を設定しました。アイテムの追加フォームを使用して、1 つまたは複数のカテゴリに関連付けられたアイテムを追加したいと考えています。フォームを送信すると、「保護された属性を一括割り当てできません: カテゴリ」というエラーが表示されます。

ここに私のモデルがあります:

class Item < ActiveRecord::Base
  attr_accessible :description, :image, :name

  has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }

  belongs_to :user
  has_and_belongs_to_many :categories

  validates :name, presence: true, length: {maximum: 50}
  accepts_nested_attributes_for :categories
end

class Category < ActiveRecord::Base
  attr_accessible :description, :name
  has_and_belongs_to_many :items

  validates :name, presence: true, length: {maximum: 50}
end

そして私の移行:

class CreateItems < ActiveRecord::Migration
  def change
    create_table :items do |t|
      t.string :name
      t.text :description
      t.has_attached_file :image

      t.timestamps
    end
  end
end

class CreateCategories < ActiveRecord::Migration
  def change
    create_table :categories do |t|
      t.string :name
      t.string :description

      t.timestamps
    end
  end
end

class CreateCategoriesItems < ActiveRecord::Migration
  def up
    create_table :categories_items, :id => false do |t|
      t.integer :category_id
      t.integer :item_id
    end
  end

  def down
    drop_table :categories_items
  end
end

そして、私のフォームは次のようになります。

<%= form_for(@item, :html => { :multipart => true }) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>


  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.label :description %>
  <%= f.text_field :description %>
  <%= f.file_field :image %>
  <%= f.collection_select(:categories, @categories,:id,:name)%>
  <%= f.submit "Add Item", :class => "btn btn-large btn-primary" %>
<% end %>

ここに私のItemsコントローラーがあります:

class ItemsController < ApplicationController

  def new
    @item = Item.new
    @categories = Category.all
  end

  def create
    @item = Item.new(params[:item])
    if @item.save
      #sign_in @user
      flash[:success] = "You've created an item!"
      redirect_to root_path
    else
      render 'new'
    end
  end

  def show
  end

  def index
    @items = Item.paginate(page: params[:page], per_page: 3)
  end


end

ご協力ありがとうございます:)

-リベカ

4

2 に答える 2

2

一括代入は通常、属性ハッシュの一部としてオブジェクトを作成する呼び出しに属性を渡すことを意味します。

これを試して:

@item = Item.new(name: 'item1', description: 'description1')
@item.save
@category = Category.find_by_name('category1')
@item.categories << @category

以下も参照してください。

http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

これが役立つことを願っています。

于 2012-06-05T20:22:32.820 に答える
1

IAmNaN が上記のコメントを投稿しましたが、それは私のコードが正常に動作する中でリンクが見つからないというものでした。それ以来、HABTM セットアップを取得するプロセスを詳述するブログ投稿を書きました。ありがとうIAmNaN!

于 2012-06-06T23:03:27.307 に答える