如何在button_to表单中添加其他参数?

时间:2011-02-03 13:54:06

标签: ruby-on-rails forms

我想要一个Submit按钮。它会更新提交中的一个字段; submission.state = :submitted

现在,我可以制作一个自定义路线和一个自定义动作,然后发布到那个。但这似乎非常严厉。特别是因为我还有一个reject按钮,可能还有更多。需要定制路线&每个人的行动对我来说都是愚蠢的。

如果我可以做类似

的事情会更好
button_to "Submit", submission_url(submission), :method => :put, :submission => { :state => :submitted }

哪个会发布到提交的update方法并仅更新所需的字段。

但这不起作用。我怎样才能使它工作?或者您对如何做到这一点有更好的了解?

7 个答案:

答案 0 :(得分:43)

@AugustinRiedinger提到的pull request已经合并,现在可以从 Rails 4.1.0 获得。现在只需添加params选项:

params: { state: :submitted }

答案 1 :(得分:11)

它并不简洁,但如果没有扩展Rails,这将让我:

= form_for submission, :html => { :class => "button_to" } do |f|
    = f.hidden_field :state, :value => :submitted
    = f.submit "Submit", :class => "link"

答案 2 :(得分:9)

最后添加params:{},它将生成hidden_​​field

<%= button_to user.name, user, class:"btn btn-default", style:"", method: :patch, remote: true, params: { a_field: false, an_other_field:"a new value" } %>

答案 3 :(得分:5)

我有类似的东西有效:

button_to "Submit", submission_url(submission, :submission => { :state => :submitted }), :method => :put

答案 4 :(得分:3)

所以,从这个rails pull请求:https://github.com/rails/rails/pull/10471

以下是您可以执行自定义button_to的操作。

application_helper.rb中,添加以下行:

module ApplicationHelper
  // Unfortunately these 2 methods need to be redefined. I don't know how I could access the original ones.
  def token_tag(token=nil)
    if token != false && protect_against_forgery?
      token ||= form_authenticity_token
      tag(:input, type: "hidden", name: request_forgery_protection_token.to_s, value: token)
    else
      ''
    end
  end

  def method_tag(method)
    tag('input', type: 'hidden', name: '_method', value: method.to_s)
  end

  def button_to_with_params(name = nil, options = nil, html_options = nil, &block)
    html_options, options = options, name if block_given?
    options      ||= {}
    html_options ||= {}

    html_options = html_options.stringify_keys
    convert_boolean_attributes!(html_options, %w(disabled))

    url    = options.is_a?(String) ? options : url_for(options)
    remote = html_options.delete('remote')
    params = html_options.delete('params') { Hash.new }

    method     = html_options.delete('method').to_s
    method_tag = %w{patch put delete}.include?(method) ? method_tag(method) : ''.html_safe

    form_method  = method == 'get' ? 'get' : 'post'
    form_options = html_options.delete('form') || {}
    form_options[:class] ||= html_options.delete('form_class') || 'button_to'
    form_options.merge!(method: form_method, action: url)
    form_options.merge!("data-remote" => "true") if remote

    request_token_tag = form_method == 'post' ? token_tag : ''

    html_options = convert_options_to_data_attributes(options, html_options)
    html_options['type'] = 'submit'

    button = if block_given?
      content_tag('button', html_options, &block)
    else
      html_options['value'] = name || url
      tag('input', html_options)
    end

    inner_tags = method_tag.safe_concat(button).safe_concat(request_token_tag)
    params.each do |name, value|
      inner_tags.safe_concat tag(:input, type: "hidden", name: name, value: value.to_param)
    end
    content_tag('form', content_tag('div', inner_tags), form_options)
  end
end

使用它:

= button_to_with_params 'Awesome button', awesome_action_path, method: :put, :params => {:my_param => 'my_value'}

享受!玩得开心栏杆!

答案 5 :(得分:1)

如果我以正确的方式提交标准的铁轨表格,那么我正确地阅读了您有意做某些事情的事情。

请注意,使用例如

提交表单时

f.submit "Save Changes"

然后

params[:commit] = "Save Changes"

关于这一点的好处是,它可以允许您在控制器更新操作中进行一些适当的分支。

BAD的事情是它很脆弱。如果有一天你或其他人决定更改按钮文本,那么事情就会破坏......这很糟糕。

ķ

答案 6 :(得分:0)

从Rails 3.2.1开始,您可以使用:form键为:html_options哈希添加其他参数。

http://apidock.com/rails/v3.2.1/ActionView/Helpers/UrlHelper/button_to

这在3.2.1之前不存在,因此需要更详细的声明具有隐藏属性的表单的解决方案。