Rails не удалось найти пользователя с помощью auth_token

#ruby-on-rails #ruby-on-rails-3 #authentication #cookies #auth-token

#ruby-on-rails #ruby-on-rails-3 #аутентификация #файлы cookie #auth-токен

Вопрос:

У меня только что возникла довольно странная проблема с моим приложением rails 3.2.18

Я использую аутентификацию с помощью файлов cookie, как описано в Railscasts. За последний год (пока я не обновился до 3.2.18) все было хорошо.

Однако теперь у меня возникла следующая проблема. Я могу успешно войти в систему и перейти к нескольким страницам. Однако после неопределенного количества кликов по странице я получаю ошибку внутренней страницы 500. В моем рабочем журнале я вижу следующую ошибку (я изменил фактический код токена)

 ActiveRecord::RecordNotFound (Couldn't find User with auth_token = XXXXXXXXXXXXXX):
  app/controllers/application_controller.rb:28:in `current_user'
 

Когда я смотрю на запись базы данных для этого пользователя, я вижу правильную запись auth_token. Строка кода, на которую ссылается контроллер приложения, является

 @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
 

Так что да, нужно повторить это с помощью оператора where, а не find_by, чтобы что-то сделать в Rails 4, но это, я не думаю, должно вызывать проблему, также странно, что первоначальная аутентификация, а затем несколько кликов по страницам работают, а затем это не работает.

Чтобы снова войти в систему, мне нужно завершить сеанс браузера (у меня такой же в Firefox, Safari и IE), а затем перезапустить, и я могу войти в систему на некоторое время.

Кроме того, я не сталкиваюсь с этой проблемой в разработке, только в производстве

Ответ №1:

Ну, в конце я изменил запрос find_by на запрос where следующим образом

Оригинал

 @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
 

Новое

 @current_user ||= User.where("auth_token =?", cookies[:auth_token]).first if cookies[:auth_token]
 

И это, похоже, решило проблему. Я думал, что find_by был удален в Rails 4, но, очевидно, что-то было не совсем счастливым.

Комментарии:

1. Недавно у нас возникла точно такая же проблема в rails 3.2.12. Вы знаете, что вызвало проблему?

2. Вы пытались использовать find_by_auth_token()? (без !)

3. Я не пробовал без взрыва (!), был счастливее пользователя с запросом where. И я действительно не нашел причину, но был доволен переходом к оператору where, который устранил проблему и лучше подходит для перехода на Rails 4