Rails + Devise: как я могу проверить, запоминается ли пользователь при входе в систему

Как я могу узнать, запомнился ли пользователь, который входит в систему, через более ранний сеанс.

Я нашел этот ответ: Rails/Devise: выполнить действие после автоматического входа и он говорит, что метод after_remembered вызывается после того, как пользователь был запомнен. Я попробовал это и поместил в свою модель, но она не вызывается. Я даже поставил binding.pry перед этой строкой https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/rememberable.rb#L30 но вся аутентификация! метод даже не вызывается при входе в систему.

Я надеюсь, что кто-то может помочь


person Mexxer    schedule 12.11.2015    source источник
comment
В devise есть столбец, который называется user_sign_in_count. Вы можете использовать это в методе after_sign_in с условным   -  person xeitor    schedule 12.11.2015
comment
Единственный метод, который я нашел, который похож на тот, который вы упомянули, это github.com/plataformatec/devise/blob/master/lib/devise/ и я не думаю, что это поможет мне, потому что мне придется проверять изменения в sign_in_count. Если пользователь запоминается, счет не меняется. Я имею в виду, что я мог бы сохранить счет до действия контроллера и сравнить его после его завершения, но это действительно хакерский подход. Я надеялся на более элегантное решение.   -  person Mexxer    schedule 13.11.2015
comment
Когда вы говорите пользователь, вы имеете в виду уже зарегистрированного?   -  person xeitor    schedule 13.11.2015
comment
да зарегистрированный пользователь, который автоматически входит в систему с помощью функции «запомнить меня»   -  person Mexxer    schedule 13.11.2015
comment
Возможно, я нашел решение... Вероятно, я могу создать обратный вызов after_update в модели и проверить, изменилось ли поле current_sign_in_at. Если нет, то пользователь запомнился, и я могу установить атрибут attr_accessor. Завтра попробую :)   -  person Mexxer    schedule 13.11.2015


Ответы (1)


Хорошо, моя предыдущая идея с созданием обратного вызова after_update не сработала, так как он не обновлялся в запоминаемом сеансе.

То, что я в конечном итоге сделал, не очень красиво, но я также не хотел, чтобы надзиратель был обезьяньим пятном.

class Users::SessionsController < Devise::SessionsController
  around_action :check_remembered, only: :create

  def create
    super
  end

  private
  def check_remembered
    # find the user based on the email in the login params. 
    # You can't use current_user here because once you call it, 
    # it will update the user before the action even ran (no idea why)
    user = User.find_by_email(params[:user][:email])
    yield
    if user && user.sign_in_count != current_user.sign_in_count
      # user was not remembered
    end
  end
 end

Для входа только по электронной почте этого достаточно. Если вы используете omniauth-вход, вы должны блокировать каждый omniauth-вход в функции check_remembered, проверяя, присутствует ли params[:user][:email]. Они должны быть обработаны в вашем контроллере omniauth.

person Mexxer    schedule 13.11.2015