Rails 3小部件助手部分

时间:2010-09-16 20:46:35

标签: ruby-on-rails ruby-on-rails-3 helpers partials

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

2 个答案:

答案 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