【问题标题】:how does form_for know the difference when submitting :new :editform_for 在提交时如何知道区别:new :edit
【发布时间】:2013-09-06 05:24:07
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    它检查@test.persisted? 如果它被持久化,那么它就是一个编辑表单。如果不是,则为新形式。

    【讨论】:

    • actionmethod 实际上基于 object.persisted? 检查:github.com/rails/rails/blob/4-0-stable/actionpack/lib/…。所以我不知道为什么这个答案被否决了。可能需要在“如果它被持久化,那么它是一个编辑表单。如果不是,它是一个新表单”中需要稍微改写一下
    【解决方案2】:

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

    换句话说:

    # app/controllers/tests_controller.rb
    def new
        @test = Test.new
    end
    

    &lt;%= form_for(@test) |do| %&gt; 生成一个块,发送到create 控制器方法。

    如果,改为:

    # app/controllers/tests_controller.rb
    def edit
        @test = Test.find(params[:id])
    end
    

    &lt;%= form_for(@test) |do| %&gt; 产生一个发送到update 控制器方法的块。

    更新

    Rails 用来识别记录是否新的精确函数是persisted? 方法。

    【讨论】:

    • 你到底是什么意思?
    • 如果是 def Newness @test = Test.new end
    • 按照 Rails 约定,表单被路由到控制器动作,这些控制器动作明确命名为 CRUD 动作。所以,是的——这些动作必须被命名为createupdate
    【解决方案3】:

    它检查记录是否是新的。

    @test.new_record? # if true then create action else update action
    

    【讨论】:

    • 这很有帮助,这个检查是在 form_for 助手中触发的吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多