根据ruby文档,translate
(或t
)帮助程序委托给I18n#translate
,但也执行几个附加功能,其中包括:;如果密钥具有后缀_html
",则它将把翻译标记为安全HTML;。
我希望它在视图和控制器中都能同样工作,但根据我的经验,它没有:t(:hello_html)
在视图中确实能按预期工作(将翻译标记为html_safe),但在从控制器调用时,它没有将结果标记为安全的html。
为了重现这个问题,您可以将hello_html: '<i>Hello world</i>'
添加到locales/en.yml
中,并将flash.now[:notice] = t(:hello_html)
添加到任何控制器的任何方便操作中。对我来说,这导致在一个flash消息区域中出现一个转义的html标记,这对我来说是一个意外的结果
我的问题是:
- 有没有其他人经历过或能够重现这个问题
- 它是什么:一个rails错误,一个功能,或者只是我项目的独特之处"怪怪的"
- 有什么简单的方法解决这个问题吗
(在轨道3.2.11和3.2.13中测试)
考虑到过载的.t
方法是在ActionView::Helpers::TranslationHelper
中定义的,您对控制器不能使用此功能的看法是正确的。我认为这可能是一个疏忽,而不是一个实际的错误。
在我的脑海中,有两种方法可以在你的项目中绕过这一点:
-
在控制器中调用
.html_safe
(这在快速测试中对我有效)。flash[:notice] = t(:hello_html).html_safe
-
将翻译密钥作为闪光消息发送,而不是实际消息:
控制器:
flash[:translate_notice] = :hello_html
视图:
%div= t flash[:translate_notice]
当然,如果需要传递插值YMMV,后一个选项可能会变得有点混乱。