2

Rails 3.2 と Ruby 1.9.3 を使用しています。

これが何度も尋ねられていることは知っていますが、私の特定の状況では何も見つかりません.

私の関係は次のようなものです。製品には多くのカテゴリがあり、カテゴリには多くの属性があります。

ビューにネストされたフォームを作成したいので、使用しています

= f.fields_for :categories do |category|
      = render 'category_fields', :f => category

商品フォームにカテゴリ フィールドを「添付」するため。

問題は、それを HTML に変換すると、カテゴリ入力の名前が次のように「categories_attributes」になることです。

<label for="product_categories_attributes_0_name">Name</label>
<input id="product_categories_attributes_0_name" type="text" size="30" name="product[categories_attributes][0][name]">

私はレールに慣れていませんが、product[categories][0][name]代わりにすべきだと思いcategories_attributesます。

フォームを送信すると、

Can't mass-assign protected attributes: categories_attributes

また、私のモデル:

class Product < ActiveRecord::Base
  belongs_to :company
  belongs_to :product_type

  has_many :categories, :dependent => :destroy
  accepts_nested_attributes_for :categories

  attr_accessible :comments, :name, :price
end

class Category < ActiveRecord::Base
  belongs_to :product
  has_many :attributes, :dependent => :destroy
  attr_accessible :name

  accepts_nested_attributes_for :attributes
end

class Attribute < ActiveRecord::Base
  belongs_to :category

  attr_accessible :name, :value
end

ほんのわずかなエラーであることは間違いありませんが、それを見つけることはできません。

ヘルプ?

4

1 に答える 1

6

Product のattr_accessible呼び出しに、 categories_attributesを追加します。

attr_accessible :categories_attributes, :comments, :name, :price

カテゴリのattr_accessible呼び出しにattributes_attributesを追加します。

attr_accessible :name, :attributes_attributes

アップデート:

ここで起こっている 3 つのことのうち、どれに取り組むことができないかわかりません。

Product モデルでaccept_nested_attributes_for :categoriesを使用すると、 categories_attributes=(attributes)メソッドがモデルに追加され、関連付けられたレコードの属性を親を介して保存できるようになります (関連付け_attributes hashを介して渡すことにより)。

これはすべて、フォームで fields_for ヘルパーを使用しているときにparamsハッシュがどのように構築されるかによって発生します。

より簡単な例:

class Product < ActiveRecord::Base
  has_many :categories
  accepts_nested_attributes_for :categories

  attr_accessible :categories_attributes, :name
end

このフォームから製品を作成している場合:

<%= form_for @product do |f| %>
  Name: <%= f.text_field :name %>

  <%= f.fields_for :categories do |c| %>
    <%= c.text_field :name %>
    <%= c.text_field :desc %>
  <% end %>

 <%= f.submit %>
<% end %>

params ハッシュには以下が含まれます。

{ :product => { :name => 'Tequila', :categories_attributes => { :name => 'essentials', :desc => 'i need more of it' } } }

または簡略化:

{ :product => { :name => 'Tequila', :categories_attributes => { ... } } }

コントローラーで製品を作成しているとき:

@product = Product.new(params[:product])

:name => 'Tequila', :categories_attributes => { ... }ハッシュを Product.new に渡します。:name:categories_attributesの 2 つのパラメーターを渡しています。Rails のセキュリティでは、新しい作成メソッドに渡すすべてのパラメーターをattr_accessible行でホワイト リストに登録する必要があります。:categories_attributesを省略すると、レールは次のように文句を言います:

Can't mass-assign protected attributes: categories_attributes

これですべてがクリアされるかどうか教えてください。

ネストされた属性の詳細

fields_forの詳細

質量割り当ての詳細

于 2013-03-18T23:56:20.677 に答える