Ruby on rails Rails-设计-用户登录条纹
我正试图用Desive记录用户连续登录的天数 向用户表中添加了一个新列time\u,因为\u在整数中签名 覆盖设计会话控制器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
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