我有一个控制器在渲染视图并输出错误之前执行以下操作。
flash[:error]="Flash error"
flash[:info] = "Flash info"
我想很好地格式化。为此,我写了一个看起来像这样的帮助
def show_flash
a=""
[:success, :info, :error, :warning].each do |key|
a += content_tag(:div, flash[key], :id => key, :class => "#{key}") unless flash[key].blank?
end
end
在我看来,我打电话给:
<%= show_flash %>
当我尝试运行时,网页会显示show_flash的全文,包括div标签,尖括号和所有内容。当我检查元素(使用Firefox或Chrome)时,它会显示用双引号括起来的文本。
然后我尝试更改帮助器中的一行,如下所示:
a = content_tag(:div, flash[key], :id=>key, :class=>"#{key]") unless flash[key].blank?
即。我只会捕获最后一个内容标记(错误)而不是它们。
在第二种情况下,Web浏览器使用我对“错误”类的CSS规则正确地格式化了div标签。我没有看到浏览器中打印出任何div标签。
为什么连接两个content_tag元素会让我感到悲伤?
我感谢你能给我的任何帮助。
答案 0 :(得分:3)
因为""
未标记为html_safe
。这是Rails的XSS保护的一部分,默认情况下在Rails 3中启用。
您可能会发现此Railscast on XSS protection信息丰富。
答案 1 :(得分:1)
事实证明,当从Rails 2转到Rails 3时,默认启用html转义,并且必须在连接content_tag
字符串之前显式禁用它。代码如下:
def show_flash
a=content_tag(:span, "",:escape=>false)
[:success, :info, :error, :warning].each do |key|
a = a+content_tag(:div, flash[key], :id => key, :class => "#{key}", :escape=>false) unless flash[key].blank?
end
a
end
该选项:escape=>false
是使它工作所需的。
Andrew Marshall指出了我正确的方向,经过一番搜索后,我偶然发现了words of wisdom from Yehuda。这就是:escape
条款变得明显的地方。