2013-07-27 3 views
2

Есть ли способ добавить скрытое поле ввода ко всем формам, объявленным в представлениях в рельсах. Скрытое поле должно иметь значение, переданное публичным свойством в контроллере. По сути, я хочу любую форму, которая предоставляется в качестве ответа веб-сервера, чтобы иметь дополнительный скрытый элемент ввода.Добавление скрытого поля ввода ко всем формам в рельсах

Как я это делаю? Могу ли я переопределить form_for некоторыми способами? Или я могу пойти с оберткой формы в частичном порядке и принудить всех использовать частичное?

ответ

4

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) 
+0

Я попытался указать submit_Tag (значение, options = {}). Кажется, он не отображает скрытый элемент ввода. Я также добавил оператор журнала, который, похоже, не работает. Я правильно приложил строителя. Все мои формы используют submit_tag. Что-нибудь, что я упускаю? – gnarsi

+0

'submit_tag' не определен в классе FormBuilder,' submit' is. Поскольку 'submit_tag' вызывается ... на самом деле я не уверен, на каком объекте эти методы * _tag вызываются, возможно, @template - я не думаю, что вы можете подклассифицировать его. Вам придется обезопасить 'submit_tag' в классе FormTagHelper, который мне кажется более хрупким. Любая причина, по которой вы не просто используете 'submit'? – bgates

+0

Я не уверен, почему это не подача в первую очередь. Я сейчас переводил его, чтобы отправить. Но есть ли способ получить доступ к текущему экземпляру контроллера и получить свойство, как в моем случае? Я не нахожу способ сделать это. – gnarsi

Смежные вопросы