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
如果我想提交嵌套资源的字段而不是父资源。我该怎么做?
我有两个模型: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