Rails4、显示属性

Rails 4, show attributes

如果我想提交嵌套资源的字段而不是父资源。我该怎么做?

我有两个模型:Product 和 Product_details。

=form_for @product do |f|
  =f.fields_for product_details do |ff|
    =ff.radio_button :price, ff.price
  =f.submit

所以我需要将上面的表格提交给 product_details_controller 而不是 products_controller。

如果我这样做 form_form product_details 我得到类似 "to_key" undefined..

最好的方法是什么?

accepts_nested_attributes_for可以帮到你。

例如:-

class Project < ActiveRecord::Base
  has_many :tasks
  accept_nested_attributes_for :tasks, :allow_destroy => true
end

在视图中

<% form_for @project do |project_form| %>
  <% project_form.fields_for :tasks do |task_form| %>
      <p>
        <div>
          <%= task_form.label :name, 'Task:' %>
          <%= task_form.text_field :name %>
        </div>
     </p>
   <%end%>
<%= project_form.submit %>
<% end %>

所以@project.save将保存子任务too.Also你可以修改控制器代码并按照你想要的方式去做

在 rails 控制台上试试

>> project = Project.first
=> #<Project id: 1, name: "Nested models patches", created_at: "2009-01-22 11:17:15", updated_at: "2009-01-22 11:17:15", author_id: 1>
>> project.tasks
=> [#<Task id: 1, project_id: 1, name: "Write 'em", due_at: nil, created_at: "2009-01-22 11:17:15", updated_at: "2009-01-22 11:17:15">,
#<Task id: 2, project_id: 1, name: "Test 'em", due_at: nil, created_at: "2009-01-22 11:17:15", updated_at: "2009-01-22 11:17:15">,
#<Task id: 3, project_id: 1, name: "Create demo app", due_at: nil, created_at: "2009-01-22 11:17:15", updated_at: "2009-01-22 11:17:15">,
#<Task id: 4, project_id: 1, name: "Scrutinize", due_at: nil, created_at: "2009-01-22 11:17:15", updated_at: "2009-01-22 11:17:15">]

>> project.tasks.second.name = "" 
=> "" 

>> project.valid?
=> false