首页 文章

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

提问于
浏览
2

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

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

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,则可以使用模块前置而不是弃用的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)
    

相关问题