代码之家  ›  专栏  ›  技术社区  ›  Kevin Sylvestre

Rails 3.0.2数组加入HTML安全?

  •  9
  • Kevin Sylvestre  · 技术社区  · 15 年前

    我有一个Rails Gem,它使用了一个片段,比如:

    components = []
    components << label_for(attribute)
    components << ...
    components << text_field(attribute)
    return components.join
    

    gem在Rails3.0.1中工作得很好,但是在更新到Rails3.0.2之后,它会忽略(在浏览器中呈现为文本)所有HTML。我做错什么了?谢谢。

    5 回复  |  直到 15 年前
        1
  •  12
  •   Marc-André Lafortune    14 年前

    正如@sj26指出的,要么使用Rails内置帮助器:

    <%= safe_join(components) %>
    

    或者用我的 rails_join 制作宝石 Array#join HTML安全意识,在这种情况下,您的原始代码将按原样工作。

        2
  •  9
  •   sj26    12 年前

    String#join 不是吗? SafeBuffer -注意。

    String#html_safe 标记您的字符串已被HTML转义,从而防止用户将HTML的某些部分偷偷带入您的页面。退房 this post 由Yehuda Katz在 安全缓冲器 以及为什么/如何使用它们。

    如果你有一个数组 String 安全缓冲器 要连接,请确保已运行 #html_safe 在他们身上,或者 #concat 它们变成了 安全缓冲器 就像这样:

    ['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat
    => "&lt;one&gt;<p>two</p>" 
    

    Rails有一个名为 safe_join 这会帮你的。

        3
  •  2
  •   grosser    14 年前

    http://makandra.com/notes/954-don-t-mix-array-join-and-string-html_safe

    class Array
      def html_safe_join(delimiter='')
        ''.html_safe.tap do |str|
          each_with_index do |element, i|
            str << delimiter if i > 0
            str << element
          end
        end
      end
    end
    [safe_string, unsafe_string].html_safe_join(' ') 
    # '<span>foo</span>&lt;span&t;bar&lt;/span&gt;'
    
        4
  •  1
  •   Adam Lassek    15 年前

    字符串在Rails3中自动进行HTML转义。您需要将最后一行更改为:

    return components.join.html_safe
    

    或者,如果编辑gem太麻烦,您可以从视图中进行操作:

    <%= helper_name.html_safe %>
    
        5
  •  0
  •   woto    14 年前

    手工报价怎么样?

    <%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %>