Rails:Views:content_tag helpers

时间:2011-03-16 01:36:33

标签: ruby-on-rails actionview actionviewhelper

我有一个控制器在渲染视图并输出错误之前执行以下操作。

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元素会让我感到悲伤?

我感谢你能给我的任何帮助。

2 个答案:

答案 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条款变得明显的地方。