【问题标题】:How to get form submit button to do update action as opposed to create action如何让表单提交按钮执行更新操作而不是创建操作
【发布时间】:2013-09-12 00:55:36
【问题描述】:

我创建了一个编辑页面,与我的新页面非常相似。但是我希望提交按钮调用相关模型的更新操作,而不是创建操作。这可能很容易做到,但我还没有弄清楚如何完成它。

通常我的按钮看起来像这样:

<%= f.submit('Text-of-button', :class => "button") %>

包含该类,以便将正确的 CSS 应用于按钮。我听说 RoR 足够聪明,可以知道提交应该是编辑还是新的,但它似乎不是。我还尝试强制控制器和操作不成功:

<%= f.submit('Update', :class => "button", :controller => 'location', :action => 'update') %>

我见过人们使用 button_to 并在按钮中包含所有必要的信息。但是当我在表格上拥有我想要的所有信息时,这似乎很混乱。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails forms button


    【解决方案1】:

    如果没有什么特别的,一般你不需要编辑表单的模板。

    只需使用创建表单并使用form_for @instance。

    form_for 会自动判断实例并安排表单路径。如果实例没有被持久化,它将指向#create。如果实例是db中的持久化对象,它会自动指向#udpate。

    【讨论】:

    • 我不确定我是否在关注,我的 form_fors 总是声明一个我认为的新实例。我正在使用每个表单字段传递的 @location 手动填充值(位置是我的模型):&lt;%= #Form Builder form_for :location, url: locations_path do |f| %&gt; 你是说我可以做form_for @location 这有可能为我构建表格吗?我试过了,它说在我的页面末尾期待$end 我还需要do |f|吗?我也试过了,当我点击提交时,它说没有路线匹配 [Put] /locations。抱歉.. 对 RoR 来说还很新
    • 实例不是在表单中创建的,而是在控制器中创建的。您在控制器中准备一个实例,然后视图吃掉它。如果在#edit 中您从 db 中找到一条记录,然后呈现表单,form_for 将知道这是一个编辑表单,因为该实例不是新的。对于其他问题,最好查看 Rails 指南,基本的东西太多了。
    • 我明白你在说什么,你现在还必须传递实例,否则方法不会转到正确的 url...完整答案是form_for @location, url: location_path(@location) do |f|
    • @Andrew,实际上你不需要在表单中定义 url,Rails 足够聪明,知道如何根据对象(比如持久化与否)和路由生成路径。我习惯了这种风格:)
    • 我明白了,我可以做到form_for @location do |f|
    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2013-07-13
    • 1970-01-01
    • 2012-06-07
    • 2019-05-13
    • 2020-07-11
    相关资源
    最近更新 更多