1

我在将应用程序迁移到 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
4

2 回答 2

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。转义字符串是使用hRails 2 上的方法完成的。在 Rails 3 上,默认情况下从视图输出的字符串会被转义,并且可以通过该raw方法禁用转义。

于 2010-09-16T21:19:00.490 回答
1

Rails 3 改变了内容过滤的工作方式——默认情况下,它假定您希望过滤所有内容。

您可以使用以下方法纠正此问题html_safe

"<!-- widget: #{widget.inspect}, #{options.inspect} -->".html_safe

见:http ://asciicasts.com/episodes/204-xss-protection-in-rails-3

于 2010-09-16T21:05:54.260 回答