我有一个标签标签,其内容是从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:(<span class="name">John Doe</span>)
</label>
我知道它与html_safe,raw和转义字符串有关,但我无法让它工作!
谢谢!
答案 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_safe
或raw
,其中.html_safe
不会是t('welcome')
,并且需要调用html_safe
或raw
来避免字符串中的html被转义。