5

関連付けの入力がグループ化されている関連付けの新しいレコードを送信できるフォームを作成しようとしています。

   class Product < AR::Base
     has_many :properties
     accepts_nested_attributes_for :properties
   end

コントローラーでは、一連のプロパティが製品用に構築されていることに注意してください@product.properties.empty? # => false

以下fields_forは、 などの名前の正しい入力を示していますproduct[properties_attributes][0][value]

= form.fields_for :properties do |pform|                                                                                                                               
  = pform.input :value

しかし、関連付けをグループ化しようとするとすぐに、正しい名前の入力が生成されなくなります。

- @product.properties.group_by(&:group_name).each do |group_name, properties|
  %h3= group_name                                                       
  = form.fields_for properties do |pform|                                                                                                                               
    = pform.input :value

これにより、実際には最初の例のようになるはずのname属性が好む入力が作成されます。product[product_property][value]product[property_attributes][0][value]

Railsのドキュメントは、これを行うことができることを示唆しています:

= form.fields_for :properties_attributes, properties do |pform|

しかし、これにより「配列の未定義のメソッド値」というエラーが発生します。

4

2 に答える 2

7

次のように設定する必要があります。

- @product.properties.group_by(&:group_name).each do |group_name, properties|
  %h3= group_name
  = form.fields_for :properties, properties do |pform|
    = pform.text_field :value

accepts_nested_attributes_for :propertiesのフィールドを作成することになっていることをレールが認識しているため、正常に動作するはずですproperties_attributes。さらに attr_accessible :properties_attributes、最新の Rails のいずれかを使用していて、まだモデルに追加していない場合は、追加することをお勧めします ;)

また、単一のプロパティに基づいて決定を下したい場合は、次のフォームも使用できます。

- @product.properties.group_by(&:group_name).each do |group_name, properties|
  %h3= group_name
  - properties.each do |property|
    = form.fields_for :properties, property do |pform|
      = pform.text_field :value

どちらもここでうまく説明されています: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_forOne-To-Manyセクションの下

于 2012-08-15T21:14:02.190 に答える
1

この種のことに対するクリーンな「Rails」ソリューションは知りませんが、私はこの種の状況をより手動で処理することがよくあります。例 - グループをループして、特定のグループにあるプロパティのみを条件付きで表示します。

class Product < AR::Base
  has_many :properties
  accepts_nested_attributes_for :properties

  def group_names
    properties.map(&:group_name).uniq.sort
  end
end

ビューで

- for group_name in product.group_names
  = form.fields_for :properties do |pform|
    %h3= group_name
    - if pform.object.group_name.eql?(group_name)
      = pform.input :value

これにより、製品からプロパティのリストを繰り返し取得するため、多少のオーバーヘッドが発生する場合があります。has_many :properties 関連付けを変更して、group_name の順序でプロパティを取得できる場合があります。新しいグループの場合は %h3 を追加できます。

- previous_group_name = nil
= form.fields_for :properties do |pform|
  - if pform.object.group_name != previous_group_name
    %h3= pform.object.group_name
  = pform.input :value
  - previous_group_name = pform.object.group_name

あなたのためのいくつかのアイデア...

于 2012-08-15T18:57:31.350 に答える