1

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

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 元素会导致我如此悲痛?

我很感激你能给我的任何帮助。

4

2 回答 2

3

因为""没有标记为html_safe. 这是 Rails 的 XSS 保护的一部分,在 Rails 3 中默认启用。

你可能会发现这个Railscast 关于 XSS 保护的信息。

于 2011-03-16T01:40:49.267 回答
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 )为我指明了正确的方向,经过一番搜索,我偶然发现了耶胡达的智慧之言。这就是该:escape条款变得明显的地方。

于 2011-03-16T04:45:44.840 回答