我已经生成了一个脚手架,我们称之为脚手架测试。 在那个脚手架中,我有一个_form.html.erb,它正在为动作渲染:new => :create和:edit => :更新
Rails有时会做很多魔术,我无法弄清楚form_for如何调用正确的:在按下提交时动作:new和:edit
脚手架形式
<%= form_for(@test) do |f| %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
VS。 非脚手架形式
<% form_for @test :url => {:action => "new"}, :method => "post" do |f| %>
<%= f.submit %>
<% end %>
<h1>Editing test</h1>
<%= render 'form' %>
<h1>New test</h1>
<%= render 'form' %>
正如您所看到的,表格之间没有区别 两个模板如何呈现相同的表单但使用不同的操作?
答案 0 :(得分:54)
它检查@test.persisted?
如果它是持久的,则它是一个编辑表单。如果不是,那就是一种新形式。
答案 1 :(得分:5)
检查记录是否为新记录。
@test.new_record? # if true then create action else update action
答案 2 :(得分:3)
如果@test
实例变量通过Test.new
类方法实例化,则执行create
方法。如果@test
是数据库中存在的Test
实例,则会执行update
方法。
换句话说:
# app/controllers/tests_controller.rb
def new
@test = Test.new
end
<%= form_for(@test) |do| %>
生成一个发送到create
控制器方法的块。
如果,而不是:
# app/controllers/tests_controller.rb
def edit
@test = Test.find(params[:id])
end
<%= form_for(@test) |do| %>
生成一个发送到update
控制器方法的块。
<强>更新强>:
Rails用于识别记录是否为新记录的精确函数是persisted?
方法。