19

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

これは、Ryan Bate の「nested_form_for」にもあります。

どんなポインタでも大歓迎です!

アダム

4

4 に答える 4

38

コレクションを使用しfields_forて期待どおりに動作させるには、モデルがコレクションのネストされた属性を受け入れる必要があります。コレクションがActiveRecord1 対多の関係である場合は、accepts_nested_attributes_forclass マクロを使用します。コレクションがActiveRecord1 対多の関係でない場合は、コレクションの getter とコレクションの属性の setter を実装する必要があります。

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 %>
于 2014-07-08T11:14:25.043 に答える
23

Docs forfields_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これがあなたの配列です。

于 2012-06-26T17:26:26.840 に答える
7



ストレート データで作業していて、これらの @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 %>

params データは次のように返されるはずです

"team" => {
  "people" => [
    {"first_name" => "Michael", "last_name" => "Jordan"},
    {"first_name" => "Steve", "last_name" => "Jobs"},
    {"first_name" => "Barack", "last_name" => "Obama"}
  ]
}
于 2015-02-19T00:05:13.003 に答える
5

かろうじて知られているの回答への追加 (評判ポイントのためにコメントとして追加できませんでした) -

非アクティブ レコードの場合は、persisted?に加えてクラスでも定義する必要がありました*_attributes=(attributes)

于 2015-04-20T15:50:45.257 に答える