【问题标题】:How to cache true or false value from request header in Rails?如何在 Rails 中缓存请求标头中的真值或假值?
【发布时间】: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


    【解决方案1】:

    一旦您在用户登录后确定用户是否有 gravatar,就将标志存储在会话中。但是,请务必在用户注销时将其清除。

    【讨论】:

    • 谢谢。在这种情况下,flag 是什么意思?
    • 会话[:g_flag] = gravatar?(user); - 用户登录后执行此操作。在您看来 "/> 有意义吗?
    • 这正是我最终要做的。感谢您的帮助。
    【解决方案2】:

    您可以将其存储在用户对象本身中(并保留在数据库中)。这样,下次用户登录时,就不用再做gravatar解析了。

    现在你有另一个(更困难的)问题:什么时候使这个缓存失效?

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 1970-01-01
      • 2015-11-26
      • 2019-08-20
      • 2016-06-29
      • 2017-06-10
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多