form_for在提交时如何知道差异:new:edit

时间:2013-09-03 05:05:23

标签: ruby-on-rails forms model-view-controller

我已经生成了一个脚手架,我们称之为脚手架测试。 在那个脚手架中,我有一个_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' %>

正如您所看到的,表格之间没有区别 两个模板如何呈现相同的表单但使用不同的操作?

3 个答案:

答案 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?方法。