Ruby on rails 自动将隐藏字段添加到窗体

Ruby on rails 自动将隐藏字段添加到窗体,ruby-on-rails,simple-form,Ruby On Rails,Simple Form,我正在尝试构建一个简单的表单,它在表单中添加一些隐藏字段,而不使用form.hidden\u字段。我注意到utf8和UTU令牌隐藏字段会自动添加到每个表单中 是否有类似的机制来添加另一个自定义隐藏字段,但仅添加到由我的自定义表单生成器生成的表单?您可以扩展自定义表单以获得类似的方法 def custom_form_for(object, *args, &block) options = args.extract_options! simple_form_for(object, *

我正在尝试构建一个简单的表单,它在表单中添加一些隐藏字段,而不使用form.hidden\u字段。我注意到utf8和UTU令牌隐藏字段会自动添加到每个表单中

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

您可以扩展自定义表单以获得类似的方法

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

隐藏字段将是表单的最后一个元素;如果您切换行,它将是第一行。

您可以将其集成到自定义输入中,而不是在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出现时,隐藏字段才会出现?通行证

编辑:对于有趣的细节,utf8和Authentity标记隐藏字段是在form标记中实现的,而不是在FormBuilder中实现的:

要使用的秘密列表,它允许您获取模板中生成的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

这行不通。simple_form_for返回更精确的字符串:SafeBuffer。您不能调用该字段上的.hidden\u字段。@iblue您是对的。修正了那个问题-看起来我太匆忙了。这也不起作用。block.callform返回Fixnum。很高兴知道。。。我开始觉得自己很笨。
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