2013-07-06 2 views
0

메신저로 사용자 로그인 수를 유지하려고 시도하는 중입니다.Rails - Devise - User Sign In Streak

사용자 테이블에 time_since_sign_in 정수가 새 열로 추가되었습니다.

최우선 고안 세션 컨트롤러

devise_for :users, controllers: { sessions: "sessions" } 

내가

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 

그렇게 분명히 고안 사용자 모델에 추가로 서명하기 전에 ATTR를 업데이트 할 것이라고 생각하는이이 훅을했다 추가 추적 필드를 업데이트합니다. 하지만 성공하기 전에 왜 불려지나요? 어떻게 내가이 일을 할 수있는 아이디어?

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

난 당신을 이해하지 않습니다. 정확히 작동하지 않는 것은 무엇입니까? – phoet

+0

죄송합니다. 그래서 update_sign_in_streak에서 binding.pry에서 멈추게되면, last_sign_in_at는 관리자 콜백 – ndreckshage

+0

에 의해 이미 업데이트되었으므로 time_since_sign_in 변수는 항상 0으로 설정됩니다. – ndreckshage

답변

0

내가 나쁜 해킹을 생각하지만, 사람이 더 나은 해답이있는 경우 알려 주시기 바랍니다

(BTW 문제가 다시는 last_sign_in_at의 ATTR가 만드는 작업을하기 전에 prepend_before_filter에 업데이트되는 것입니다 그래서 나는 last_sign_in_at 값에 대한 액세스 권한을 갖지 못했습니다.)

forked devise!

추적 가능한 모델

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