Ruby On Rails教程 - Gravatar注入文本而不是图像

时间:2012-07-24 06:11:11

标签: ruby-on-rails ruby-on-rails-3.2

问:如何在不破解教程代码的情况下解决此问题?我想减少远离教程代码。

我正在研究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机箱。

2 个答案:

答案 0 :(得分: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让你失望 - 它基本上是shorthand for sprintf。)

答案 1 :(得分:0)

尝试

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

rails 3之后的默认行为是在使用<%= ... %>时转义HTML; raw禁用此行为。

More details