2012-04-29 24 views
5

Theo tập Rails Guidesthis Railscasts, khi có một one-to-many mối liên hệ giữa hai đối tượng (ví dụ ProjectTask), chúng tôi có thể gửi nhiều trường hợp của Task cùng với Project trong quá trình gửi hình thức tương tự như sau:Rails nhóm mảng băm trong quá trình gửi biểu mẫu như thế nào?

<% form_for :project, :url => projects_path do |f| %> 
    <p> 
    Name: <%= f.text_field :name %> 
    </p> 
    <% for task in @project.tasks %> 
    <% fields_for "project[task_attributes][]", task do |task_form| %> 
     <p> 
     Task Name: <%= task_form.text_field :name %> 
    Task Duration: <%= task_form.text_field :duration %> 
     </p> 
    <% end %> 
    <% end %> 
    <p><%= submit_tag "Create Project" %></p> 
<% end %> 

này sẽ dẫn đến nhiều bản sao của một khối HTML như thế này trong các hình thức, một cho mỗi công việc:

<p> 
    Task Name: <input name="project[task_attributes][name]"> 
    Task Duration: <input name="project[task_attributes][duration]"> 
</p> 

Câu hỏi của tôi là, làm thế nào Rails hiểu mà

(project[task_attributes][name], project[task_attributes][duration]) 

thuộc về nhau, và đóng gói chúng thành một yếu tố băm của mảng kết quả params? Có đảm bảo rằng các trình duyệt phải gửi các tham số biểu mẫu theo cùng thứ tự mà chúng xuất hiện trong nguồn không?

+1

Duh! Chỉ tìm thấy câu trả lời [ở đây] (http://stackoverflow.com/questions/3300201/does-dom-order-determine-the-order-of-form-parameters-posted). Rõ ràng đây là yêu cầu của tiêu chuẩn. –

Trả lời

1

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"} 
    ] 
} 
+0

HTML được tạo ra sẽ làm cho câu trả lời này áp dụng cho rất nhiều người khác đang tìm kiếm nó, nếu bạn muốn thêm nó :) – Kevin

+0

yep, HTML sẽ giúp – 23tux

+0

Có, vui lòng cung cấp HTML. –

2

Vâng, trật tự là giữ nguyên như là, như @ k-everest tự trả lời như một bình luận cho câu hỏi ban đầu.

Những người yêu cầu HTML, xem guide về cách phân tích cú pháp của thuộc tính name.

Ví dụ về trật tự thường xấu:

cart[items][][id]=5 
cart[items][][id]=6 
cart[items][][name]=i1 
cart[items][][name]=i2 

Và đó được phân tích bởi Rails vào đây:

{ "cart"=> {"items"=> [ 
         {"id"=>"5"}, 
         {"id"=>"6", "name"=>"i1"}, 
         {"name"=>"i2"} 
         ]}} 

nguồn Ví dụ: https://spin.atomicobject.com/2012/07/11/get-and-post-parameter-parsing-in-rails-2/

Các tính năng được thêm vào trong Rails' ban đầu cam , với tên phương thức build_deep_hash. Để biết thêm lịch sử, hãy bỏ qua chiến tranh rực lửa/ngữ nghĩa và truy cập bài đăng cuối cùng từ cuối ở đây: https://www.ruby-forum.com/topic/215584

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