axios/rack-cors/ реакции-рельсы / герою: внутренняя ошибка сервера 500 при выходе из системы, отсутствие сохранения при обновлении

ОШИБКА MSG: Error: Request failed with status code 500 Stack trace: [42]/</t.exports@http://crdwk.herokuapp.com/packs/bundle-ecc8ea14dbe153e50352.js:1:89311 [42]/</t.exports@http://crdwk.herokuapp.com/packs/bundle-ecc8ea14dbe153e50352.js:1:251725 [42]/</t.exports/</d[h]@http://crdwk.herokuapp.com/packs/bundle-ecc8ea14dbe153e50352.js:1:88311

Рубиновая версия: 2.3

Rails версия: 5.1

У меня на стороне сервера отображается, клиентское гидратированное приложение React / Rails (используя gem 'react-rails').

Я добавил gem 'rack-cors' плюс настройка в application.rb чтобы мои запросы работали (я использую axios). Тем не менее, выход из системы (запрос DELETE) завершается неудачно, а нажатие на обновление удаляет текущего пользователя. Ни одна проблема не возникает локально / в разработке.

Вот приложение: http://crdwk.herokuapp.com/

И репо: https://github.com/English3000/crdwk

1 ответ

Я посмотрел на мои журналы Heroku:

Completed 500 Internal Server Error in 8ms (ActiveRecord: 0.0ms)
NoMethodError (undefined method `reset_token' for nil:NilClass):
app/controllers/application_controller.rb:29:in `sign_out'
app/controllers/api/sessions_controller.rb:3:in `destroy'

Учитывая, что при нажатии на кнопку обновления текущий пользователь не сохраняется, проблема заключается в том, что текущий пользователь как-то не устанавливается.

Однако это не проблема в разработке. С чего бы это?

Просматривая мой проект, единственное отличие, которое я могу найти на бэкэнде, по сравнению с визуализированным на стороне клиента (который я буквально скопировал и вставил код для этого проекта), состоит в том, что эта строка в application_controller.rb:

skip_before_action :verify_authenticity_token

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

Started POST "/api/users" for 127.0.0.1 at 2018-03-05 12:16:57 -0800
Processing by Api::UsersController#create as JSON
  Parameters: {"user"=>{"email"=>"", "password"=>"[FILTERED]"}}
Can't verify CSRF token authenticity.
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:

Это результат использования gem 'react-rails', (Я не получаю эту ошибку для моего другого проекта на стороне клиента.)

Там нет "authenticity_token" параметр.

Я нахожу эти два ресурса: безопасность Rails и инструкции по Learnetto.

Поэтому я добавляю эти две строки кода из второй артиллерии в мой api.js:

const csrfToken = document.querySelector("meta[name=csrf-token]").content;
axios.defaults.headers.common["X-CSRF-Token"] = csrfToken;

Теперь мое веб-приложение работает с дополнительным application_controller.rb строка закомментирована. За исключением того, что я не могу использовать DOM, чтобы получить токен csrf для моей версии React Native, поэтому у меня теперь та же проблема для мобильных устройств...

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