自动添加隐藏字段以形成

时间:2014-08-18 12:52:36

标签: ruby-on-rails simple-form

我正在尝试在simple_form中构建 custom form builder ,这会在不使用form.hidden_field的情况下向表单添加一些隐藏字段。我注意到utf8authenticity_token个隐藏字段会自动添加到每个表单中。

是否有类似的机制来添加另一个自定义隐藏字段,但仅限于由我的自定义表单构建器生成的表单

3 个答案:

答案 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,utf8authenticity_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