我想要一个Submit
按钮。它会更新提交中的一个字段; submission.state = :submitted
现在,我可以制作一个自定义路线和一个自定义动作,然后发布到那个。但这似乎非常严厉。特别是因为我还有一个reject
按钮,可能还有更多。需要定制路线&每个人的行动对我来说都是愚蠢的。
如果我可以做类似
的事情会更好button_to "Submit", submission_url(submission), :method => :put, :submission => { :state => :submitted }
哪个会发布到提交的update
方法并仅更新所需的字段。
但这不起作用。我怎样才能使它工作?或者您对如何做到这一点有更好的了解?
答案 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之前不存在,因此需要更详细的声明具有隐藏属性的表单的解决方案。