我将应用程序移动到Rails 3时遇到了一个大问题。我有一个视图助手,我称之为'WidgetHelper'。当我引用它时,它有助于自动渲染一些部分。例如
<%= widget('loginbox', :global => true) %>
但它无法正常工作。它会根据需要呈现HTML代码,但会转义返回值,这是不期望的。我如何告诉渲染(或某些东西)不为我逃避返回值?
这是我的代码:
def widget(widget, options={})
begin
unless options[:fullpath]
render :partial => widget_path(widget, options[:global])
else
render "widgets/#{widget}"
end
rescue ActionView::MissingTemplate
"<!-- widget: #{widget.inspect}, #{options.inspect} -->"
end
end
答案 0 :(得分:3)
def widget(widget, options={})
begin
unless options[:fullpath]
raw render(:partial => widget_path(widget, options[:global]))
else
raw render("widgets/#{widget}"))
end
rescue ActionView::MissingTemplate
raw "<!-- widget: #{widget.inspect}, #{options.inspect} -->"
end
end
Rails 3的raw
方法与Rails 2中的h
方法相反。在Rails 2上使用h
方法转义字符串。在Rails 3上,字符串输出默认情况下从视图中进行转义,并且可以通过raw
方法禁用转义。
答案 1 :(得分:1)
Rails 3改变了内容过滤的工作方式 - 默认情况下假设您希望过滤所有内容。
您可以使用html_safe
:
"<!-- widget: #{widget.inspect}, #{options.inspect} -->".html_safe
请参阅:http://asciicasts.com/episodes/204-xss-protection-in-rails-3