Rails在标签标签内转义字符串

时间:2014-06-10 15:01:27

标签: ruby-on-rails ruby ruby-on-rails-3 internationalization html-safe

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

html.erb

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

person_name是一个帮助器并输出一个字符串

persons_helper.rb

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

输出字符串在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,raw和转义字符串有关,但我无法让它工作!

谢谢!

3 个答案:

答案 0 :(得分:0)

在label_tag内的方法调用上调用.html_safe。 E.g:

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

答案 1 :(得分: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 } %>

注意:我也在此示例中切换到选择I18n翻译的"helpers.form.name"方法以进一步提高可读性(但这可能只是个人偏好 - 所以如果您愿意,请使用原始样式!)。

最后,出于安全目的 - 以便用户的姓名未经过转义 - 您应该从.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。希望这并不会让人感到困惑。 :)一般情况下,当你100%确定它们实际上总是安全时(即它们来自你的系统而不是来自任何类型的用户输入)时,只将字符串标记为html_safe

答案 2 :(得分:0)

轨道翻译可以自动命名为try: ftp = pysftp.Connection(host, username=user, password=password) except: print("Couldn't connect to ftp") return False ,但可以使用命名约定。如果翻译后缀为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')中,将是t('title.html')个字符串,不需要调用html_saferaw,其中.html_safe不会是t('welcome'),并且需要调用html_saferaw来避免字符串中的html被转义。

请参见https://github.com/Yenthe666/auto_backup/issues/47