2012-06-26 22 views
15

Làm cách nào tôi có thể lặp qua một mảng đối tượng (tất cả cùng một kiểu) bằng cách sử dụng fields_for? Mảng chứa các đối tượng được tạo bởi current_user.bằng cách sử dụng một mảng với fields_for

Tôi hiện có:

<%= 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 %> 

Nhưng tôi muốn thay thế: descriptionsbyuser với một mảng tôi tạo ra trong điều khiển của tôi - @descriptionsFromCurrentUser

Đây cũng là bên Ryan Bate "nested_form_for"

Bất kỳ con trỏ nào sẽ được đánh giá cao!

Adam

Trả lời

18

Docs for fields_for rõ ràng cho bạn thấy cách sử dụng mảng:

Hoặc một bộ sưu tập sẽ được sử dụng:

<%= 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 đây là mảng của bạn.

+0

cảm ơn jdoe! Đúng thứ tôi cần! – adamteale

+11

Điều này không hiệu quả đối với tôi. Tôi nhận được một cái gì đó như 'undefined method 'name' cho # '. – Ajedi32

+3

@ Ajedi32 et al => Mô hình của bạn cần triển khai setter cho các thuộc tính thu thập. Xem câu trả lời từ hầu như không biết. – barelyknown

22

Để sử dụng bộ sưu tập cho fields_for và làm việc theo cách bạn mong đợi, mô hình cần chấp nhận thuộc tính lồng nhau cho bộ sưu tập. Nếu bộ sưu tập là một mối quan hệ một - nhiều ActiveRecord, hãy sử dụng macro lớp accepts_nested_attributes_for. Nếu bộ sưu tập không phải là mối quan hệ một - nhiều ActiveRecord, bạn cần phải triển khai bộ sưu tập getter và bộ sưu tập thuộc tính bộ sưu tập.

Nếu đó là một mối quan hệ ActiveRecord:

class Person 
    has_many :projects 

    # this creates the projects_attributes= method 
    accepts_nested_attributes_for :projects 
end 

Nếu nó là một phi ActiveRecord mối quan hệ:

class Person 
    def projects 
    ... 
    end 

    def projects_attributes=(attributes) 
    ... 
    end 
end 

Dù bằng cách nào, hình thức là như nhau:

<%= form_for @person do |f| %> 
    ... 
    <%= f.fields_for :projects, @active_projects do |f| %> 
    Name: <%= f.text_field :name %> 
    <% end %> 
    ... 
<% end %> 
+0

+1 cho chi tiết triển khai không phải của ActiveRecord.Bằng cách nào đó mắt tôi từ chối để xem những gì đã được giải thích rõ ràng trong các tài liệu ... –

5

tôi thấy đây là cách sạch nhất

nếu bạn đang làm việc với các dữ liệu thẳng và muốn gửi lại một mảng mà không sử dụng bất kỳ các @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 dữ liệu của bạn nên quay trở lại như thế này

"team" => { 
    "people" => [ 
    {"first_name" => "Michael", "last_name" => "Jordan"}, 
    {"first_name" => "Steve", "last_name" => "Jobs"}, 
    {"first_name" => "Barack", "last_name" => "Obama"} 
    ] 
} 
5

Một sự thêm vào câu trả lời barelyknown của (không thể thêm làm nhận xét do các điểm danh tiếng) -

Đối với trường hợp không phải là người phát hiện, tôi cũng phải xác định persisted? trong lớp học của tôi ngoài *_attributes=(attributes).

Các vấn đề liên quan