Ruby on rails Rails-设计-用户登录条纹

Ruby on rails Rails-设计-用户登录条纹,ruby-on-rails,devise,Ruby On Rails,Devise,我正试图用Desive记录用户连续登录的天数 向用户表中添加了一个新列time\u,因为\u在整数中签名 覆盖设计会话控制器 devise_for :users, controllers: { sessions: "sessions" } 添加了我认为会在登录前更新attr的内容 class SessionsController < Devise::SessionsController def create current_user.update_sign_in_streak

我正试图用Desive记录用户连续登录的天数

向用户表中添加了一个新列time\u,因为\u在整数中签名

覆盖设计会话控制器

devise_for :users, controllers: { sessions: "sessions" }
添加了我认为会在登录前更新attr的内容

class SessionsController < Devise::SessionsController
  def create
    current_user.update_sign_in_streak
    # even if i comment out super, last_sign_in_at still gets updated
    super
  end
end
显然Deave有这个钩子,它可以更新跟踪字段。但为什么在创建成功之前会调用它?有什么办法可以让它工作吗

Warden::Manager.after_set_user :except => :fetch do |record, warden, options|
  if record.respond_to?(:update_tracked_fields!) && warden.authenticated?(options[:scope]) && !warden.request.env['devise.skip_trackable']
    record.update_tracked_fields!(warden.request)
  end
end

我发现了一个很糟糕的黑客,但是如果有人有更好的答案,请告诉我

(顺便说一句,问题是在创建操作之前,attr上的最后一个\u签名\u在\u过滤器中得到更新,因此我永远无法访问值上的最后一个\u签名\u)

叉形装置

可跟踪模型

def update_tracked_fields!(request)
  update_sign_in_streak

  # ...
end

def update_sign_in_streak
  time_since_sign_in = Time.now - self.last_sign_in_at
  if time_since_sign_in.between?(1.day, 2.day)
    self.sign_in_streak += 1
  elsif time_since_sign_in > 2.day
    self.sign_in_streak = 1
  end
end

我不明白你的意思。到底什么不起作用?对不起。因此,如果我在update_sign_in_streak下的binding.pry处停止,那么最后一个_sign_in_at已被典狱长回调更新,因此自我设置变量_sign_起的时间将始终为0/接近它
def update_tracked_fields!(request)
  update_sign_in_streak

  # ...
end

def update_sign_in_streak
  time_since_sign_in = Time.now - self.last_sign_in_at
  if time_since_sign_in.between?(1.day, 2.day)
    self.sign_in_streak += 1
  elsif time_since_sign_in > 2.day
    self.sign_in_streak = 1
  end
end