EDIT: ОК, мой первый проход на этом не работает, потому что вы не можете определить значение в инициализаторе, которое вы позже собираетесь передать с контроллера. Таким образом, вы можете сделать это одним из двух способов. Вы можете определить CustomFormBuilder
класс - поместить его в инициализаторе -
class CustomFormBuilder < ActionView::Helpers::FormBuilder
def submit(value, options = {})
@template.hidden_field_tag(options.delete(:custom_param)) + super
end
end
Затем пройти :builder
опции form_for
form_for @whatever, builder: CustomFormBuilder
и если вы звоните submit(value, options)
в форме, где опция включает в свой CUSTOM_PARAM, он будет перезаписан специальным методом, который вставляет ваше скрытое поле со значением, которое вы хотите.
Альтернативой является обезьяна патч обезьяны патч FormTagHelper вместо:
module ActionView::Helpers::FormTagHelper
def extra_tags_for_form_with_custom_param(html_options)
hidden_field_tag(html_options.delete('custom_param') +
extra_tags_for_form_without_custom_param(html_options)
end
alias_method_chain :extra_tags_for_form, :custom_param
end
Вот настройки кода form_for
использует, чтобы вставить маркер подлинности в верхней части каждой формы. Теперь вы можете передать, что пользовательские параметры для form_for
после установки его в качестве переменного экземпляра в контроллере:
form_for @object, custom_param: @custom_param do |f|
Если вы используете Ruby, 2.0+, то вы можете использовать модуль перед именем вместо устаревшей alias_method_chain например,
module CustomParamFormPatch
private
def extra_tags_for_form(html_options)
hidden_field_tag(html_options.delete('custom_param')) +
super
end
end
ActionView::Base.prepend(CustomParamFormPatch)
Я попытался указать submit_Tag (значение, options = {}). Кажется, он не отображает скрытый элемент ввода. Я также добавил оператор журнала, который, похоже, не работает. Я правильно приложил строителя. Все мои формы используют submit_tag. Что-нибудь, что я упускаю? – gnarsi
'submit_tag' не определен в классе FormBuilder,' submit' is. Поскольку 'submit_tag' вызывается ... на самом деле я не уверен, на каком объекте эти методы * _tag вызываются, возможно, @template - я не думаю, что вы можете подклассифицировать его. Вам придется обезопасить 'submit_tag' в классе FormTagHelper, который мне кажется более хрупким. Любая причина, по которой вы не просто используете 'submit'? – bgates
Я не уверен, почему это не подача в первую очередь. Я сейчас переводил его, чтобы отправить. Но есть ли способ получить доступ к текущему экземпляру контроллера и получить свойство, как в моем случае? Я не нахожу способ сделать это. – gnarsi