Rails & Devise - как определить, когда пользователь выходит из системы? - PullRequest
0 голосов
/ 07 мая 2020

В моем приложении Rails у меня есть несколько after_commit ... on: :update обратных вызовов, которые отвечают за выполнение некоторой работы после того, как пользователь обновит настройки своей учетной записи.

Проблема в том, что эти обратные вызовы запускаются, когда пользователь выходит из системы. Я проверил, что обновляется для пользователя, позвонив self.previous_changes, и вот результат:

=> {"remember_created_at"=>[Wed, 06 May 2020 20:32:09 UTC +00:00, nil], "updated_at"=>[Thu, 07 May 2020 14:52:42 UTC +00:00, Thu, 07 May 2020 14:54:40 UTC +00:00]}

Итак, как вы можете видеть, выход из системы очищает "remember_created_at" и обновляет "updated_at".

Я мог бы создать для пользователя метод с именем is_logging_out?, который проверяет эти два измененных атрибута и возвращает истину, но это выглядит взломанным, и мне было интересно, есть ли более элегантный способ сделать это.

(В случае необходимости, я использую devise v3.5.10)

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Обратные вызовы модели имеют этот недостаток. Я настоятельно рекомендую не использовать обратные вызовы модели в пользу декораторов или явного вызова. Однако, если вы уверены, что вам нужен этот обратный вызов, почему бы не попробовать пропустить обратный вызов, если remember_created_at не равно нулю?

def your_callback_method
  return unless remember_created_at

  #do stuff
end

Вы можете либо пропустить его в самом методе обратного вызова, либо добавить if: -> { record.remember_created_at } к объявлению after_commit

Пожалуйста, не добавляйте метод с именем is_logging_out? в модель, потому что это не является ответственностью модели. Модель не должна зависеть от того, какое действие выполняет пользователь.

0 голосов
/ 07 мая 2020

Вы действительно хотите в первую очередь использовать обратные вызовы модели? Они по своей природе хакерские, и обычно становится все труднее контролировать, когда и где они запускаются. Не замедляйте ваши тесты и не создавайте более неожиданных ошибок в будущем.

class UsersController < Devise::SessionsController
  def update
    super do |user|
      # do something awesome
    end
  end
end
devise_for :users, controller: {
  registrations: 'my_sessions'
}
...