Rails 3.0.2 Array#join HTML Safe?

Kev*_*tre 9 ruby-on-rails

我有一个rails gem,使用如下代码片段:

components = []
components << label_for(attribute)
components << ...
components << text_field(attribute)
return components.join
Run Code Online (Sandbox Code Playgroud)

这个gem在Rails 3.0.1中工作得很好,但是在更新到Rails 3.0.2之后它会逃脱(在浏览器中呈现为文本)所有HTML.我做错了什么?谢谢.

Mar*_*une 12

正如@ sj26指出的那样,要么使用rails内置助手:

<%= safe_join(components) %>
Run Code Online (Sandbox Code Playgroud)

或者使用我的rails_joingem来让Array#joinhtml安全感知,在这种情况下你的原始代码将按原样运行.


sj2*_*j26 9

String#join不是 - SafeBuffer意识到.

String#html_safe标记您的字符串已经HTML转义,以防止用户将一些HTML隐藏到您的页面中.看看Yehuda Katz 发表这篇文章SafeBuffer以及为什么/如何使用它们.

如果你有一个String并且SafeBuffer你想要连接的数组,请确保你已经运行#html_safe它们,或者#concat它们是SafeBuffer这样的:

['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat
=> "&lt;one&gt;<p>two</p>" 
Run Code Online (Sandbox Code Playgroud)

Rails有一个内置的帮助程序safe_join,它将为您执行此操作.

  • 现在更正确的答案是使用[`safe_join(array)`] [http://apidock.com/rails/ActionView/Helpers/OutputSafetyHelper/safe_join],这是一个理解`SafeBuffer`的`Array#join`. (2认同)