我试图用设计来记录用户的连续数(天数)。
将新列time_since_sign_in整数添加到用户表。
覆盖设计会话控制器
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
添加到用户模型
def update_sign_in_streak
# binding.pry
# at this point last_sign_in_at always updated
time_since_sign_in = Time.now - last_sign_in_at
if time_since_sign_in.between?(1.day, 2.day)
increment! :sign_in_streak
elsif time_since_sign_in > 2.day
sign_in_streak = 0
save
end
end
所以显然设计有这个钩子,它更新跟踪字段。但为什么在创建成功之前就会调用它?关于如何让这个工作的任何想法?
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
答案 0 :(得分:0)
我发现了一个糟糕的黑客,但如果有人有更好的答案,请告诉我
(顺便说一句,问题是last_sign_in_at attr在创建操作之前在prepend_before_filter中更新,因此我无法访问last_sign_in_at值)
分叉设计!
可追踪模型
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