【问题标题】:authlogic current_user trackingauthlogic current_user 跟踪
【发布时间】:2011-03-21 21:43:38
【问题描述】:

我使用 authlogic 进行身份验证,使用回形针处理用户的个人资料图片附件。

我用下面的方法来获取current_user

    def current_user_session
        return @current_user_session if defined?
(@current_user_session)
        @current_user_session = UserSession.find
    end

def current_user
        return @current_user if defined?(@current_user)
        @current_user = current_user_session &&
current_user_session.record
    end

如果图像已更改,则使用以下 after_save 回调重新生成配置文件图像。

   after_save do |user|
        if user.image_changed?
            Delayed::Job.enqueue ImageJob.new(user.id)
        end
    end

current_user 方法发出一个 UserSession.find 调用和 查看文档似乎 UserSession.tries 记录用户 in,这会导致对某些字段(updated_at、token 等但不是个人资料图像)进行更新,从而导致 保存用户记录,在我的情况下导致 after_save 回调触发。这在保存回调后检查是否有 更改了用户的个人资料图片,这会不必要地消耗时间。

如果用户确实在尝试这样做,这很好 更新个人资料,但因为我在许多不同的地方使用 current_user 在我的应用程序中,这个回调被触发(而且它很昂贵 打电话),无缘无故。

我知道这不完全是 authlogic 问题,但无论如何我 可以避免这种情况,即不更新用户记录或以某种方式 区分什么是配置文件更新和什么是更新 从此 UserSession.find 登录产生的结果?

谢谢

这是基于 bjg 建议的有效解决方案。

before_save :check_what_changed

def check_what_changed 如果 self.changed.sort == ["last_request_at", "perishable_token"] self.skip_profile_update = true 返回真 别的 self.skip_profile_update = false 返回真 结尾 结束

更新 #2 我收回了没有用的那个,但是这个解决方案并不是真正的问题,出于某种原因,回形针甚至在 after_save 回调之前尝试保存附件。这可能是回形针问题,不知道..

【问题讨论】:

    标签: ruby-on-rails performance callback authlogic


    【解决方案1】:

    我对 bjg 的解决方案有疑问,因为有时我只会得到 'last_request_at' 而不是 'updated_at',所以 skip_profile_update 会是假的。

    我将其更改为应该触发 after_save 的字段白名单列表,而不是黑名单方法。通过更改array comparison method 可以轻松将其更改为黑名单。我还发现有必要包含所有“真”,因为否则我会遇到那些可怕的“ActiveRecord 记录未保存”错误。

    attr_accessor :record_activity
    
    before_save do |user|
        user.record_activity = (user.changed & ['email', 'birthday', 'zip', 'gender']).present?
        true
      end
    
      after_update do |user|
        if user.record_activity
         user.send(:record_update_activity)
         true
        end
        true
      end 
    

    【讨论】:

      【解决方案2】:

      before_save 回调中,您可以使用Rails 内置的脏对象跟踪工具区分真实 配置文件更改和Authlogic 相关更改(last_request_atupdated_at 属性) .类似的东西

      attr_accessor :skip_profile_update
      
      before_save do |model|
        model.skip_profile_update = (model.changed.sort == ['last_request_at', 'updated_at'])
      end
      
      after_save do |model|
        unless model.skip_profile_update
          # etc
        end
      end
      

      【讨论】:

      • 谢谢。 authlogic 更新的更改字段实际上是 ['last_request_at', 'perishable_token'],但这里还有另一个问题,在常规配置文件更新期间 before_save 回调评估为 nil 并且更新操作中的 update_attributes 调用失败。我无法使用此技巧保存常规个人资料。
      • 这工作..感谢您的帮助! before_save :check_what_changed def check_what_changed if self.changed.sort == ["last_request_at", "perishable_token"] self.skip_profile_update = true return true else self.skip_profile_update = false return true end end
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多