问:如何在不破解教程代码的情况下解决此问题?我想减少远离教程代码。
我正在研究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&size=52" />
它显示了这一点(显示文字,而不是图像):
<img class="gravatar" alt="" width="52" height="52" src="http://www.gravatar.com/avatar/b58996c504c5638798eb6b511e6f49af?rating=PG&amp;size=52" />
我的视图文件包含:
<%= 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机箱。
答案 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
禁用此行为。