我正在尝试在simple_form
中构建 custom form builder ,这会在不使用form.hidden_field
的情况下向表单添加一些隐藏字段。我注意到utf8
和authenticity_token
个隐藏字段会自动添加到每个表单中。
是否有类似的机制来添加另一个自定义隐藏字段,但仅限于由我的自定义表单构建器生成的表单?
答案 0 :(得分:6)
您可以将其集成到自定义输入中,而不是在FormBuilder级别修补此内容:
class MagicInput < SimpleForm::Inputs::HiddenInput
def input
if object.condition?
@builder.hidden_field(:hidden_field_name, value: "some value").html_safe
# You could also call #super here (instead of the previous call)
# because this extends HiddenInput (might be cleaner, depending on what you
# want to achieve)
end
end
end
仅当object.condition?
为true时,此自定义输入才会在表单中注入隐藏字段。
显然,您需要在传递给表单的对象上创建#condition?
方法(或者用监视器替换此条件行浮动您的船)。
然后在您看来,您可以将其称为:
= f.input :something, as: :magic
只有当object.condition?
通过时,您的隐藏字段才会显示。
修改:对于多汁的detials,utf8
和authenticity_token
隐藏字段在form_tag
中实现 - 而不是在FormBuilder中实现:{{3 }}
答案 1 :(得分:1)
您可以像这样扩展custom_form_for
方法
def custom_form_for(object, *args, &block)
options = args.extract_options!
simple_form_for(object, *(args << options.merge(:builder => CustomFormBuilder))) do |form|
block.call(form) << form.input_field(:field, :as => :hidden, :value => 'value')
end
end
隐藏字段将是表单的最后一个元素;如果你换行,它将是第一个。
答案 2 :(得分:1)
秘密是使用 capture ,它允许您获取模板中生成的HTML。然后,您可以使用form.hidden_field
方法(实际上是任何方法)添加隐藏字段,该方法直接返回生成的HTML。
def custom_form_for(object, *args, &block)
options = args.extract_options!.merge(builder: CustomFormBuilder)
simple_form_for(object, *(args << options)) do |form|
capture do
block.call(form)
end.tap do |content|
content << form.hidden_field "foo", value: "bar"
content << form.hidden_field "baz", value: "qux"
# ...
end
end
end