10

I am using the automatic form label helper for creating my form labels and having them translated via the i18n support, however, I want to have HTML in the label and I can't figure out how to make it HTML safe.

For example:

en:
  helpers:
    label:
      product:
        name: 'Your Product Name <small>Try to be creative</small>'

Ends up as:

<label for="product_name">Your Product Name &lt;Try to be creative&gt;</label>

But I want it to be:

<label for="product_name">Your Product Name <small>Try to be creative</small></label>

Is there a way for me to specify the translation as html_safe so that it doesn't get encoded before the output?

Also, this seems like the most semantic way for the HTML to be setup but I am open to suggestions if I am approaching this entirely the wrong way.

Thanks :)

Updated:

<%= form_for @product do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
<% end %>
4

4 回答 4

15

在 rails3 中使普通密钥自动成为 html 安全的方法是将 _html 或 .html 附加到密钥名称中。例如name_html。这只能通过视图中的 translate/t 方法起作用,即不能通过 I18n.t 这无论如何在这里都不起作用,因为标准表单助手不会尝试该版本的密钥。

创建自己的表单构建器是建议的方式。你也可以做

f.label :name, t('helpers.label.product.name_html')

如果这只发生在几个地方。

于 2010-12-07T10:33:18.997 回答
12

不知道您的实际助手如何,但您可以使用html_safe它轻松地做到这一点(前提是您的标签值不会被其他用户输入)。

就像是:t("helpers.label.product.name").html_safe

如果这不起作用,请提供您的辅助方法的实现,或仅提供用于输出结果的行。

====== 已更新 ======

感谢您更新的代码,现在我知道最好的答案是什么:D

我也不知道你是否真的想要helpers.label.product.name

但我认为还有另一种更好的方法,它的定义如下:

en:
  activerecord:
    attributes:
      product:
        labels:
          name: "Your Product Name <small>Try to be creative</small>"

如果您不想构建自己的自定义表单构建器,请使用:

= f.label :name, Product.human_attribute_name("labels.name").html_safe

实际上,如果您定义自己的表单构建器,很容易重新定义标签方法以自动生成它的文本。

于 2010-12-07T02:59:00.643 回答
0

我用一个新函数解决了这个问题,我把它放在一个帮助文件中:

def labeltext_with_html(model,field)
  I18n.t("helpers.label.#{model}.#{field}").html_safe
end

我这样称呼它:

label(my_model, my_field, labeltext_with_html(my_model, my_field))

只需调整变量以适合您的用例。label 标签可能还需要.html_safe,具体取决于用例。

于 2020-12-05T09:44:50.867 回答
-9

另一种选择是执行以下操作:

    name: '<span>Your Product Name <small>Try to be creative</small></span>'
于 2012-08-09T23:34:20.680 回答