向rails中的所有表单添加隐藏的输入字段

时间:2013-07-27 04:32:06

标签: ruby-on-rails forms

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

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

1 个答案:

答案 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)