【问题标题】:Adding a hidden input field to all the forms in rails向 rails 中的所有表单添加隐藏的输入字段
【发布时间】:2013-07-27 04:32:06
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    编辑:好的,我的第一次传递不起作用,因为您无法在初始化程序中定义稍后将从控制器传递的值。因此,您可以选择两种方法中的一种。 您可以定义一个 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)
    

    【讨论】:

    • 我尝试指定 submit_Tag(value, options = {}) 。它似乎没有呈现隐藏的输入元素。我还添加了一个似乎不起作用的日志语句。我已经正确地附加了构建器。我的表单都使用了 submit_tag。我错过了什么?
    • submit_tag 没有在 FormBuilder 类上定义,submit 是。由于submit_tag 被调用......实际上我不确定那些 *_tag 方法被调用的对象,@template 也许 - 我认为你不能子类化它。您必须在 FormTagHelper 类中对 submit_tag 进行猴子补丁,这对我来说感觉更脆弱。你有什么理由不只是使用submit
    • 我不知道为什么它首先不是提交。我现在将其转换为提交。但是有没有一种方法可以访问当前的控制器实例并像我的情况一样获取属性?我没有找到办法。
    • @custom_param设置为控制器中的实例变量。
    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 2021-04-04
    • 1970-01-01
    • 2013-04-23
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多