簡體   English   中英

Rails-Devise-用戶登錄連勝

[英]Rails - Devise - User Sign In Streak

即時通訊試圖保持用戶數簽到設計連勝(天)。

在用戶表中添加了新列time_since_sign_in整數。

重寫devise會話控制器

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

我發現了一個錯誤的hack,但是如果有人有更好的答案,請告訴我

(順便說一句,問題是在創建操作之前,在prepend_before_filter中對last_sign_in_at屬性進行了更新,因此我永遠無法訪問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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM