Подтвердить что ты не робот

Как добавить дополнительные параметры в форму button_to?

Я хочу иметь кнопку Submit. Он обновляет одно поле в представлении; submission.state = :submitted

Теперь я мог бы создать настраиваемый маршрут и настраиваемое действие и просто отправить сообщение. Но это кажется очень тяжелым. Тем более, что у меня также есть кнопка reject и, возможно, больше. Необходимость настраиваемого маршрута и действия для каждого из них кажется мне просто глупым.

Было бы намного лучше, если бы я мог сделать что-то вроде

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

Который отправил бы в метод отправки update и обновил только нужное поле.

Но это не работает. Как я могу заставить его работать? Или у вас есть лучшее представление о том, как это сделать?

4b9b3361

Ответ 1

Запрос pull, указанный @AugustinRiedinger, был объединен и теперь доступен как Rails 4.1.0. Теперь просто добавьте параметр params:

params: { state: :submitted }

Ответ 2

Это не так лаконично, но без расширения Rails это заставит меня:

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

Ответ 3

Добавить параметры: {} в конце, он будет генерировать 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" } %>

Ответ 4

У меня есть нечто похожее, которое работает:

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

Ответ 5

Итак, как из этого рельса вытащите запрос: 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'}

Наслаждайтесь! Удачи! Перила!

Ответ 6

Если я правильно прочитаю, что вы действительно хотите сделать что-то конкретное, когда стандартная форма рельсов представлена ​​стандартным образом.

Обратите внимание, что когда форма отправляется с использованием, например,

f.submit "Save Changes"

то

params[:commit] = "Save Changes"

ХОРОШЕЕ дело в том, что оно может позволить вам сделать какое-то соответствующее ветвление в действии обновления контроллеров.

ПЛОХАЯ вещь в том, что она хрупка. Если однажды вы или кто-то другой решите изменить текст кнопки, все ломается. Это плохо.

К

Ответ 7

В Rails 3.2.1 вы можете добавить дополнительные параметры в хеш: html_options, используя ключ формы.

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

Это не существовало до 3.2.1, поэтому требовалось более подробное решение объявления формы со скрытыми атрибутами.