0

我有一个标签标签,其内容是从 en.yml 文件加载的。

html.erb

<%=label_tag(:name, t(:name, scope:[:helpers, :form], name: person_name(person))).html_safe%>

person_name 是一个助手并输出一个字符串

person_helper.rb

def person_name(person)
    content_tag(:span,
                formatted_name(person.name) || t("helpers.persons.default_name"),
                class: 'name').html_safe
end

帮助器的输出字符串在 t 方法上传递并连接如下

en.yml

  name: "Person Name: (%{name})"

我希望输出像

<label for="person">
  Person Name:
  <span class='name> John Doe </span>
</label>

但相反我得到

<label for="person">
  Person Name:(&lt;span class="name"&gt;John Doe&lt;/span&gt;)
</label>

我知道它与 html_safe、原始和转义字符串有关,但我就是无法让它工作!

谢谢!

4

3 回答 3

0

I18n.t方法似乎没有返回 SafeBuffer(即 html_safe 字符串)。所以你应该调用.html_safe这个方法的输出。

<%= label_tag(:name, t(:name, scope:[:helpers, :form], name: person_name(person)).html_safe) %>

请注意,.html_safe呼叫已从您获得呼叫的位置移到一个括号中。这也可以通过使用label_tag帮助程序的块形式稍微更容易看到。

<%= label_tag(:name) { t("helpers.form.name", name: person_name(person)).html_safe } %>

注意:在这个例子中我也切换到了"helpers.form.name"选择 I18n 翻译的方法,以进一步提高可读性(但这可能只是个人喜好——所以如果你愿意,请使用你的原始风格!)。

最后,为了安全起见——这样用户的名字就不会被非转义——你应该.html_safe从你的person_name助手中删除并添加一个严格的html_escape(或sanitize),使它看起来像这样:

def person_name(person)
  content_tag(:span,
    h(formatted_name(person.name)) || t("helpers.persons.default_name"),
    class: 'name')
end

在这种形式中,content_tag将确保html_safe除了内容之外的一切。这意味着person.name意志会按原样通过并根据需要逃脱。但是,如果formatted_name方法返回已转义的名称或html_safe名称,则不需要这样做。基本上,关键是您不想盲目地将字符串标记为html_safe来自用户输入的值,因为您不知道它们是否包含脚本标签或什么。希望这没有混淆。html_safe:) 通常,仅在您 100% 确定它们实际上总是安全的情况下才标记字符串(即它们来自您的系统内部,而不是来自任何类型的用户输入)。

于 2014-06-10T16:35:44.140 回答
0

调用.html_safelabel_tag 内的方法调用。例如:

<%=label_tag(:name, t(:name, scope:[:helpers, :form], name: person_name(person).html_safe))%>
于 2014-06-10T15:10:51.680 回答
0

Rails 翻译可以自动标记为,html_safe但使用命名约定。如果翻译后缀为 ,_html则字符串标记为html_safe,同样,命名html的键也标记为html_safe

# config/locales/en.yml
en:
  welcome: <b>welcome!</b>
  hello_html: <b>hello!</b>
  title:
    html: <b>title!</b>

在上面t('hello_html'),andt('title.html')将是html_safe字符串,不需要调用raw.html_safewhere ast('welcome')不需要html_safe调用raw.html_safe避免字符串中的 html 被转义。

请参阅http://guides.rubyonrails.org/i18n.html#using-safe-html-translations

于 2018-07-23T15:28:09.313 回答