从模型中注入表单选项和输入标签

时间:2013-12-26 22:26:57

标签: ruby-on-rails rails-models modular-design

如何在模型中使用form_for @user的构建器生成的表单中添加选项和字段? (即不触及HTML)

我想这样做的原因是我在我的模型中添加了一个可插拔模块,我想让它自动(a)在HTML中添加data属性来为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,但我想知道是否有人知道。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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

快乐的monkeypatching!