2013-07-06 42 views
0

即時通訊設法保持計數的用戶登錄條紋(天)與設計。Rails - Devise - 用戶登錄條紋

向用戶表中添加了一個新的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

我想出了一個糟糕的黑客,但如果任何人有一個更好的答案,請讓我知道

(順便說一句這個問題再次是,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 
相關問題