2

有没有办法将隐藏的输入字段添加到在 rails 视图中声明的所有表单。隐藏字段需要有一个由控制器中的公共属性传递的值。本质上,我希望 Web 服务器作为响应给出的任何表单都有一个额外的隐藏输入元素。

我该怎么做?我可以通过某种方式覆盖 form_for 吗?或者我可以使用部分形式的包装器并强制每个人都使用部分吗?

4

1 回答 1

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+,那么您可以使用模块 prepend 而不是已弃用的 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)
于 2013-07-27T05:05:11.410 回答