Ruby on rails Rails3-raw/html\u在某些情况下不安全?

Ruby on rails Rails3-raw/html\u在某些情况下不安全?,ruby-on-rails,ruby-on-rails-3,encoding,Ruby On Rails,Ruby On Rails 3,Encoding,即使我使用的是raw或html\u-safe,我的输出仍无法编码 这是我最后一个HTML页面中的 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.followe

即使我使用的是
raw
html\u-safe
,我的输出仍无法编码

这是我最后一个HTML页面中的

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
def build_tag_cloud(tag_cloud,style_list)
tag_cloud.sort!{| x,y | x.permalink y.permalink}
最大值,最小值=0,0
标记| cloud.each do |标记|
如果tag.followers.to_i>max,则max=tag.followers.to_i
如果tag.followers.to_i“/shows”、:action=>“show”、:permalink=>tag.permalink}、:class=>“#{style#u list[(tag.followers.to#i-min)/除数])
html+=raw(“
  • {link}
  • ”) 结束 返回原始(html.to_s) 结束

    使用
    raw
    html\u-safe
    时允许什么?我上面的示例如何修复?

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

    资料来源:

    此外,除非此方法位于视图页面上(这将是Rails MVC的糟糕实现),否则不能使用
    link\u 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
    
    def build_tag_cloud(tag_cloud,style_list)
    ...
    html=“”
    标记| cloud.each do |标记|
    name=tag.name.gsub('&','&;').gsub('','')
    html+=“”
    结束
    html.html_安全
    结束
    
    raw和html安全方法都明确告诉rails不要转义您的输出(首选raw,并避免显式转义)


    我怀疑您使用raw的原因是因为li标签。我建议使用内容标签帮助器。那你就根本不需要乱编码了。您可能需要将link_to方法直接放到content_for:li中,这样链接才能正常工作(我会先尝试不使用)


    我也注意到了这一点,但没有找到原因,说明它为什么不起作用。我不确定是否允许在字符串上多次使用
    raw
    html\u-safe
    ,如果向“safe”字符串添加内容,会发生什么情况。build\u-tag\u cloud是一个帮助器。我还尝试在最后使用raw/html\u-safe(与您的html.html\u-safe一样)。重复的raw只是试图找到放置它的位置。那么
    build\u tag\u cloud
    方法在哪个类上呢?应用程序控制器还是辅助文件?你试过我的代码了吗?好的,如果把a标记作为字符串,而不是使用link_to方法,那么它就可以工作了。虽然我觉得它很难看的代码。为什么我不能保证链接到html的安全?!不确定。事实上,我有点惊讶地发现链接到helpers内部是有效的,因为我的印象是它只在视图类上有效。我猜html_安全在helper类中的字符串上执行,但是指向helper的链接在到达视图之前不会转换为字符串。也许你可以把.html_安全地放在视图代码中,在那里它可以呈现属性,然后它就可以工作了?实际上我已经在做了。关于帮手;它们具有视图的完整上下文。本质上,link_to也是一个助手:)使用content_标记对我不起作用。html+=content_标记(:li,link_to(“#{name}”,some_路径,:class=>“some_类”))