Rails 3 - raw / html_safe在某些情况下不起作用?

时间:2011-10-29 11:22:07

标签: ruby-on-rails ruby-on-rails-3 encoding

即使我使用rawhtml_safe,我也难以对输出进行编码。

这是在我的最终HTLM页面中写出&nbsp

def build_tag_cloud(tag_cloud, style_list)
    tag_cloud.sort!{ |x,y| x.permalink <=> y.permalink }
    max, min = 0, 0
    tag_cloud.each do |tag|
        max = tag.followers.to_i if tag.followers.to_i > max
        min = tag.followers.to_i if tag.followers.to_i < min
    end

    divisor = ((max - min) / style_list.size) + 1

    html = ""
    tag_cloud.each do |tag|
        name = raw(tag.name.gsub('&','&amp;').gsub(' ','&nbsp;'))
        link = raw(link_to "#{name}", {:controller => "/shows", :action => "show", :permalink => tag.permalink}, :class => "#{style_list[(tag.followers.to_i - min) / divisor]}")
        html += raw("<li>#{link}</li> ")
    end
    return raw(html.to_s)
end

使用rawhtml_safe时允许哪些内容?我的上面例子应该如何解决?

2 个答案:

答案 0 :(得分:3)

此代码来自哪个类? raw方法是在帮助器上声明的,因此它只能在控制器和视图上使用。

来源:raw vs. html_safe vs. h to unescape html

此外,除非此方法在视图页面上(这只是Rails的MVC的不良实现),否则您无法使用link_to函数。该助手仅适用于视图。此外,您不需要在此功能中重复调用raw。我认为你可以这样做:

def build_tag_cloud(tag_cloud, style_list)
  ...
  html = ""
  tag_cloud.each do |tag|
    name = tag.name.gsub('&','&amp;').gsub(' ','&nbsp;')
    html += "<a href='#{shows_show_path(tag.permalink)}' class='#{style_list[(tag.followers.to_i - min) / divisor]}'>#{name}</a>"
  end
  html.html_safe
end

答案 1 :(得分:1)

raw和html_safe方法都专门告诉rails 不要 转义输出(raw是首选,并且避免使用显式的to_s)。

raw Reference
html_safe Reference

我怀疑你使用raw的原因是因为li标签。我建议使用内容标记助手。那么你根本不需要乱用编码。您可能需要将link_to方法直接放入content_for:li以使链接正常工作(我会先试试)。

content_tag Reference