【发布时间】:2014-02-28 06:17:25
【问题描述】:
在我的 Rails 应用程序中,我构建了一个小的 gravatar 助手,用于检查用户是否拥有 gravatar。如果用户有一个,它将被显示。如果她/他没有,则会显示一个通用的占位符图像。
module GravatarHelper
def gravatar
if signed_in? && gravatar?(current_user)
id = Digest::MD5::hexdigest(current_user.email.strip.downcase)
url = 'http://www.gravatar.com/avatar/' + id + '.jpg'
image_tag(url)
else
image_tag("placeholder.png")
end
end
private
def gravatar?(user)
hash = Digest::MD5.hexdigest(user.email.to_s.downcase)
options = { :rating => 'x', :timeout => 2 }
http = Net::HTTP.new('www.gravatar.com', 80)
http.read_timeout = options[:timeout]
response = http.request_head("/avatar/#{hash}?rating=# {options[:rating]}&default=http://gravatar.com/avatar")
response.code != '302'
rescue StandardError, Timeout::Error
true
end
end
我的问题是,由于我的应用程序中每个页面的右上角都显示了 gravatar,因此 gravatar?(user) 会在每个请求上运行,这非常昂贵且耗时。
有没有办法只运行函数一次,比如在登录时,然后cache 返回值?我尝试将返回值存储在实例变量中,但无法使其正常工作。
感谢您的建议。
【问题讨论】:
标签: ruby-on-rails ruby memoization