32

我已经生成了一个脚手架,我们称之为脚手架测试。在那个脚手架中,我有一个 _form.html.erb 正在为动作的 :new => :create 和 :edit => :update 渲染

Rails 有时会做很多魔术,我无法弄清楚 form_for 是如何知道在 :new 和 :edit 之间按下提交时如何调用正确的 :action

脚手架形式

<%= form_for(@test) do |f| %>


  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

与非脚手架形式

 <% 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' %>

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

4

3 回答 3

65

它检查@test.persisted?如果它是持久的,那么它是一个编辑表单。如果不是,它是一种新形式。

于 2013-09-03T05:08:08.930 回答
9

它检查记录是否是新的。

@test.new_record? # if true then create action else update action
于 2013-09-03T05:13:53.263 回答
4

如果@test实例变量是通过Test.new类方法实例化的,则create执行该方法。如果是数据库中存在@test的实例,则执行该方法。Testupdate

换句话说:

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

于 2013-09-03T05:12:09.857 回答