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のメソッドは、Rails 2rawのメソッドの逆をh行います。文字列のエスケープは、Rails 2 のメソッドで行われましたh。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 に答える