如何在模型中使用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
,但我想知道是否有人知道。
答案 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!