Обновление current_sign_in_at и last_sign_in_at в приложении rails

Я использую свою собственную логику входа с помощью bcrypt. Однако мне нравится обновлять два атрибута (current_sign_in_at и last_sign_in_at) в моей базе данных. Итак, я следовал логике, определенной в Devise Gem, чтобы учесть свое решение.

То, как Devise Gem реализует это в Devise :: Models :: Trackable.update_tracked_fields! и вызывает обратный вызов Warden в разработать / крючки / trackable.rb. Однако следующие две реализации ничего не делают с базой данных при входе в систему.

Так мне нужен обратный вызов или что-то внутри контроллера, чтобы вызвать это? Или, лучше задать свой вопрос, как мне обновить current_sign_in_at и last_sign_in_at в моей базе данных при входе пользователя в систему?

Примечание я не использую Devise Gem для аутентификации пользователей, я только слежу за их надежной реализацией.

Почему бы просто не выполнить обновление в SessionsController или другом устройстве, обрабатывающем вход в систему?

max 10.09.2018 11:28

@max не могли бы вы объяснить или показать мне логику, которую вы имеете в виду при использовании SessionsController?

Afolabi Olaoluwa Akinwumi 10.09.2018 12:33
0
2
894
2

Ответы 2

вы можете написать метод для обновления current_sign_in_at и last_sign_in_at в контроллере и вызвать его в after_action для соответствующего действия sign_in

Например, если sign_in - это метод, который вызывается, когда пользователь sign_in, то

after_action:update_current_sign_in only: %i(sign_in)

Самый простой способ сделать это - просто обновить временные метки в контроллере сеансов:

class SessionsController 
  def create
    # simple example using has_secure_password
    @user = User.find_by(params[:email]) 
    if @user and @user.authenticate(params[:password])  
      @user.update(
        current_sign_in_at: Time.current,
        last_sign_in_at: Time.current
      )
      redirect_to root_path, success: 'You have been logged in'
    else
      render :new, error: 'Incorrect email or password'
    end
  end
end

Конечно, было бы более элегантно сделать это с помощью обратного вызова надзирателя, но это простое решение, которое легко проверить.

max 10.09.2018 12:48

Другие вопросы по теме