1

如何将选项和字段添加到由form_for @user模型中的构建器生成的表单中?(即不接触 HTML)

我想这样做的原因是我正在向我的模型添加一个可插入模块,并且我希望它自动(a)data在 HTML 中添加一个属性以提供 Javascript 的钩子,以及(b)添加一个额外的字段在表格中。

例如将这样一个模块添加到我的模型中:

module Dataable
  def form_options
    { 'data-foo' => true }
  end

  def form_builder_extra_fields
    hidden_field_tag :the_data
  end
end

User.send :include, Dataable

form_for输出:

<form {...} data-foo>
  <input type="hidden" name="user[the_data]" {...} />
  {...}
</form>

在视图中。

当然是我刚刚编出来的那些方法。因此,问题是双重的;如何在模型中动态添加 (1) 表单选项和 (2) 表单标签。

我现在正在窥探form_for,但我想知道是否有人知道。

4

2 回答 2

0

我不确定我是否完全理解你想要做什么。如果您只想将一些信息从控制器传送到表单,以便稍后提交,并使用用户作为乘客。

控制器

@user.new
@user.whatever = 'stuff'

看法

= form_for @user do |f|
  = hidden_tag 'user[whatever]', value: @user.whatever

如果您一遍又一遍地重复它,并希望它在模型中

模型

def add_data
  self.whatever = 'stuff'
end

控制器

@user.new
@user.add_data()
于 2013-12-27T00:37:07.103 回答
0

简短的回答:form_for是一个助手,理性的做法是用一个助手覆盖它。我不确定我是否处于正确的抽象级别,但就目前而言,这似乎是可行的。

助手将调用acts_like?以确定模块是否已包含在内。

module UsersHelper
  def form_for_users(options = {}, &block)
    if @user.acts_like? :dataable
      options.deep_merge!({ html: { 'data-foo' => true } })

      new_block = Proc.new do |builder|
        content = capture(builder, &block)

        output = ActiveSupport::SafeBuffer.new
        output.safe_concat(tag :input, {type: 'hidden', name: 'user[the_data]'})
        output << content
      end
    else
      new_block = block
    end

    form_for(@user, options, &new_block)
  end
end

快乐的猴子补丁!

于 2013-12-27T00:37:32.867 回答