0

Q: チュートリアル コードをあまりハックせずにこの問題を解決するにはどうすればよいですか? チュートリアル コードから離れるのを減らしたいと思います。

私は、Michael Hartl によるオンラインの Ruby on Rails チュートリアルに取り組んでいます。第 7 章では、Gravatar プラグインを使用してプロフィール写真を取り込み始めます。(これは Rails 3 と互換性がないように見えますが、これは問題ではありません。)

プラグインは機能していますが、Rails アプリに Gravatar 画像が表示されません。テキスト文字列を表示します。つまり、Gravatar コードを html タグではなくテキストとして挿入します。

ファイルに以下を表示する代わりに:

<img class="gravatar" alt="" width="52" height="52" src="http://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af?rating=PG&amp;size=52" />

これを示しています(画像ではなくテキストを表示しています):

&lt;img class=&quot;gravatar&quot; alt=&quot;&quot; width=&quot;52&quot; height=&quot;52&quot; src=&quot;http://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af?rating=PG&amp;amp;size=52&quot; /&gt;

私のビューファイルには以下が含まれています:

<%= gravatar_for user, size: 52 %>

Gravatar プラグインには以下が含まれます (gravatar.rb):

def gravatar(email, options={})
  src = h(gravatar_url(email, options))
  options = DEFAULT_OPTIONS.merge(options)
  [:class, :alt, :size].each { |opt| options[opt] = h(options[opt]) }
  "<img class=\"#{options[:class]}\" alt=\"#{options[:alt]}\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{src}\" />"
end

他の情報:

Rails 3.2 を実行している Windows 7 ボックスで作業しています。

4

2 に答える 2

1

html_safe次のメソッドを使用して、Rails に HTML が信頼されている (したがってエスケープしてはならない) ことを伝えます。

def gravatar_for email, options={}
  # ...
  "<img class=\"#{options[:class]}\" ... />".html_safe
end

背景: http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/

ちなみに、Rails のビルトインimage_tagヘルパーを使用するだけで、この問題をきちんと完全に回避することができますし、おそらくそうすべきです。これには、ハードコードされた長く醜い文字列を取り除くというボーナス効果があります。

def gravatar_for email, options={}
  options = DEFAULT_OPTIONS.merge options
  options[:size] = "%{size}x%{size}" % options  # image_tag expects e.g. "48x48"

  image_tag gravatar_url(email, options), options
end

(だからと言って気を悪くしないでください。"..." % options基本的には の省略形です sprintf。)

于 2012-07-24T06:33:23.400 に答える
0

試してみてください

<%= raw gravatar_for(user, size: 52) %>

Rails 3 以降のデフォルトの動作は、使用時に HTML をエスケープすること<%= ... %>です。rawこの動作を無効にします。

詳細

于 2012-07-24T06:35:58.553 に答える