Fields_forを使用してオブジェクトの配列(すべて同じモデル)を反復処理するにはどうすればよいですか?配列には、current_userによって作成されたオブジェクトが含まれています。
私は現在持っています:
<%= f.fields_for :descriptionsbyuser do |description_form| %>
<p class="fields">
<%= description_form.text_area :entry, :rows => 3 %>
<%= description_form.link_to_remove "Remove this description" %>
<%= description_form.hidden_field :user_id, :value => current_user.id %>
</p>
<% end %>
しかし、:descriptionsbyuserをコントローラーで作成した配列に置き換えたい-@ descriptionsFromCurrentUser
これもライアン・ベイトの「nested_form_for」の中にあります
どんなポインタでも大歓迎です!
アダム
fields_for
のドキュメント は、配列の使用方法を明確に示しています。
または使用するコレクション:
<%= form_for @person do |person_form| %> ... <%= person_form.fields_for :projects, @active_projects do |project_fields| %> Name: <%= project_fields.text_field :name %> <% end %> ... <% end %>
@active_projects
これが配列です。
fields_for
のコレクションを使用し、期待どおりに機能させるには、モデルがコレクションのネストされた属性を受け入れる必要があります。コレクションがActiveRecord
1対多の関係である場合は、accepts_nested_attributes_for
クラスマクロを使用します。コレクションがActiveRecord
1対多の関係でない場合は、コレクションゲッターとコレクション属性セッターを実装する必要があります。
ActiveRecord
関係の場合:
class Person
has_many :projects
# this creates the projects_attributes= method
accepts_nested_attributes_for :projects
end
ActiveRecord
以外の関係の場合:
class Person
def projects
...
end
def projects_attributes=(attributes)
...
end
end
いずれにせよ、形式は同じです。
<%= form_for @person do |f| %>
...
<%= f.fields_for :projects, @active_projects do |f| %>
Name: <%= f.text_field :name %>
<% end %>
...
<% end %>
私はこれが最もクリーンな方法であることがわかりました
ストレートデータを使用していて、これらの@objectsを使用せずに配列を送り返したい場合
<%= form_for :team do |t| %>
<%= t.fields_for 'people[]', [] do |p| %>
First Name: <%= p.text_field :first_name %>
Last Name: <%= p.text_field :last_name %>
<% end %>
<% end %>
パラメータデータは次のように返されます
"team" => {
"people" => [
{"first_name" => "Michael", "last_name" => "Jordan"},
{"first_name" => "Steve", "last_name" => "Jobs"},
{"first_name" => "Barack", "last_name" => "Obama"}
]
}
かろうじて知られていない回答への追加(評判ポイントのためコメントとして追加できませんでした)-
非アクティブレコードの場合、*_attributes=(attributes)
に加えて、クラスでpersisted?
も定義する必要がありました。