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

标签 ruby-on-rails forms

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

我该如何做到这一点?我可以通过某种方式覆盖 form_for 吗?或者我可以使用部分形式的包装并强制每个人都使用部分吗?

最佳答案

编辑:好的,我的第一次传递不起作用,因为您无法在初始化程序中定义稍后要从 Controller 传入的值。因此,您可以采用以下两种方法之一来解决此问题。 您可以定义一个 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,它将被自定义方法覆盖,该方法会使用您想要的值插入隐藏字段。

替代方案是猴子补丁 Monkey patch 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 用来在每个表单顶部插入真实性 token 的代码。现在,您可以在将自定义参数设置为 Controller 中的实例变量后将其传递给 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)

关于ruby-on-rails - 向 Rails 中的所有表单添加隐藏输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17894257/

相关文章:

ruby-on-rails - 如何在 ruby​​/rails 中将数据附加到 json?

ruby-on-rails - 如何为 Rails 控制台创建自定义方法?

php - 比较注册表中的两个密码

Django ModelForm ImageField

javascript - OnChange 事件不适用于选择框

forms - Delphi XE3 窗体打开和关闭

ruby-on-rails - Rails 避免在基本显示操作上使用片段缓存进行查询

ruby-on-rails - 如何在 capistrano 部署中管理捆绑的 gems?

ruby-on-rails - 以编程方式生成新用户(验证逻辑)

android - 你如何在 Android SDK 中布局滚动的表单?