#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