有没有办法将隐藏的输入字段添加到rails中视图中声明的所有表单。隐藏字段需要具有控制器中的公共属性传递的值。基本上我希望Web服务器作为响应给出的任何表单都有一个额外的隐藏输入元素。
我是怎么做到的?我可以通过某种方式覆盖form_for吗?或者我可以使用部分形式的包装并强制每个人使用部分?
答案 0 :(得分:4)
编辑:好的,我对此的第一次传递不起作用,因为您无法在初始化程序中定义一个值,以后您将从控制器传入。所以你可以采用以下两种方式之一。
您可以定义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)
,其中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)