Ruby on rails 在表单中创建自定义标签字段

Ruby on rails 在表单中创建自定义标签字段,ruby-on-rails,ruby,forms,Ruby On Rails,Ruby,Forms,我希望能够生成以下标记: <label for="field">Something <span class="hint">Field hint</span></label> 到目前为止,我已经创建了一个初始值设定项来存储自定义功能,该功能将重新打开ActionView::Helpers::FormBuilder并更改label方法,但是我不确定将跨度实际放入标签文本中的最佳方法是什么。如果我试着直接输入文本,那么rails就会逃避内容,这是正确的

我希望能够生成以下标记:

<label for="field">Something <span class="hint">Field hint</span></label>
到目前为止,我已经创建了一个初始值设定项来存储自定义功能,该功能将重新打开ActionView::Helpers::FormBuilder并更改label方法,但是我不确定将跨度实际放入标签文本中的最佳方法是什么。如果我试着直接输入文本,那么rails就会逃避内容,这是正确的


我很想使用现有的标签基础设施,因为它具有所有验证错误支持。这就排除了使用content_标记并自己生成它的可能性(这可能会起作用,但似乎…不对)。

您应该创建一个自定义生成器,并使用:builder参数将其传递给表单,而不是更改默认生成器

class HintFormBuilder < ActionView::Helpers::FormBuilder
end

form_for @resource, :builder => HintFormBuilder do |f|
# ...
end
编辑:我搞错了,您可以将自定义文本作为参数传递,这样就不需要gsub!返回的字符串。我被文本字段标记弄糊涂了。 此时,您可以使用第一个选项(使用/不使用自定义方法进行子类化)、第二个选项(使用自定义方法进行内部攻击)或第三个选项(使用自定义方法进行内部攻击),并在将文本值发送到@template.label之前截取文本值


还要注意,文本可以为零。如果为nil,则该值将从方法自动生成。您应该知道这一点。

您应该创建一个自定义生成器,并使用:builder参数将其传递给表单,而不是更改默认生成器

class HintFormBuilder < ActionView::Helpers::FormBuilder
end

form_for @resource, :builder => HintFormBuilder do |f|
# ...
end
编辑:我搞错了,您可以将自定义文本作为参数传递,这样就不需要gsub!返回的字符串。我被文本字段标记弄糊涂了。 此时,您可以使用第一个选项(使用/不使用自定义方法进行子类化)、第二个选项(使用自定义方法进行内部攻击)或第三个选项(使用自定义方法进行内部攻击),并在将文本值发送到@template.label之前截取文本值


还要注意,文本可以为零。如果为nil,则该值将从方法自动生成。你应该知道这一点。

以下是我应该做的

# config/initializers/[anything].rb
ActionView::Base.default_form_builder = CustomFormBuilder

# lib/custom_form_builder.rb
class CustomFormBuilder < ActionView::Helpers::FormBuilder
  def label(field, text, options = {})
    if options[:hint]
      hint = @template.content_tag(:span, options[:hint], :class => "hint")
      super(field, "#{field.to_s.humanize} #{hint}", options)
    else
      super
    end
  end
end
#config/initializers/[anything].rb
ActionView::Base.default\u form\u builder=CustomFormBuilder
#lib/custom_form_builder.rb
类CustomFormBuilder“hint”)
super(字段“#{field.to_.s.personalize}#{hint}”,选项)
其他的
超级的
结束
结束
结束

以下是我应该做的

# config/initializers/[anything].rb
ActionView::Base.default_form_builder = CustomFormBuilder

# lib/custom_form_builder.rb
class CustomFormBuilder < ActionView::Helpers::FormBuilder
  def label(field, text, options = {})
    if options[:hint]
      hint = @template.content_tag(:span, options[:hint], :class => "hint")
      super(field, "#{field.to_s.humanize} #{hint}", options)
    else
      super
    end
  end
end
#config/initializers/[anything].rb
ActionView::Base.default\u form\u builder=CustomFormBuilder
#lib/custom_form_builder.rb
类CustomFormBuilder“hint”)
super(字段“#{field.to_.s.personalize}#{hint}”,选项)
其他的
超级的
结束
结束
结束

我真的不想指定要在每个表单上使用的表单生成器。另外,我确信在值方面一定有比gsub-ing更好的方法……我真的不想在每个表单上指定要使用的表单生成器。另外,我相信一定有比gsub-ing更好的方法来设置值……我不知道您可以设置默认的表单生成器,这是一个非常有用的功能。你试过这种方法吗?我想它和我遇到的问题是一样的,超级方法html编码文本。我不知道你可以设置默认的表单生成器,这是一个非常有用的功能。你试过这种方法吗?我认为它与我遇到的问题相同,那就是超级方法html编码文本。
class ActionView::Helpers::FormBuilder

  def label_with_hint(method, text = nil, options = {})
    hint = options.delete(:hint)
    # do your own customizations...
    @template.label(@object_name, method, text, objectify_options(options))
  end

end
# config/initializers/[anything].rb
ActionView::Base.default_form_builder = CustomFormBuilder

# lib/custom_form_builder.rb
class CustomFormBuilder < ActionView::Helpers::FormBuilder
  def label(field, text, options = {})
    if options[:hint]
      hint = @template.content_tag(:span, options[:hint], :class => "hint")
      super(field, "#{field.to_s.humanize} #{hint}", options)
    else
      super
    end
  end
end