#ruby-on-rails #ruby-on-rails-4 #devise
#ruby-on-rails #ruby-on-rails-4 #разработка
Вопрос:
Когда я захожу на localhost:3000/users/sign_in, я перенаправляюсь на users#show с ошибкой (поскольку текущего пользователя нет) вместо страницы входа. Судя по всему, я могу понять, что этого не должно происходить, но это так. Я перенаправляюсь, если я нажимаю ссылку на new_user_session_path или если я ввожу URI напрямую.
Я просмотрел свои маршруты на наличие дубликатов и очистил сеанс и кеш. Честно говоря, весь интерфейс Devise настолько прост, что я не уверен, что еще нужно проверить. И это работало раньше, так что явно что-то изменилось.
Что еще может пойти не так?
Грабли Маршруты
# output from rake:routes
# there are no other routes for this GET path
new_user_session GET /users/sign_in(.:format) devise/sessions#new
Routes.rb
#config/routes.rb
resources :users
devise_for :users
Контроллер
#app/controllers/user_controller.rb
before_action :confirm_signed_in
def confirm_signed_in
unless user_signed_in?
initiate_return_to_last_successful
flash.now[:notice] = 'Please sign in.'
redirect_to new_user_session_path
end
end
Примечание: Совсем недавно я пытался изменить действие создания контроллера регистрации Devise. Я не уверен, что это вызвало это, но я отказался от всех изменений, связанных с этим (я полагаю. Проверено три раза.)
Комментарии:
1. У Devise есть before_action ,
authenticate_user!
которое может заменить вашеconfirm_signed_in
. Проверьте документы здесь2. Спасибо. Поскольку я хотел его изменить, я просто сделал свой собственный.
Ответ №1:
Вам нужно переключить эти две строки. Маршруты в верхней части файла имеют приоритет, и поэтому проблема заключается в ресурсах для использования сопоставления с шаблоном маршрута.
Этот маршрут, сгенерированный resources
методом, соответствует любому маршруту в формате /users/anything_can_go_here
, и часть, которая заменяет :id
, будет доступна в контроллере как params[:id]
.
GET '/users/:id' => 'users#show'
Этот маршрут, сгенерированный devise, должен быть размещен над вызовом to resources :users
, чтобы он имел приоритет в глазах Rails.
GET 'users/sign_in' => 'users#sign_in'
Чтобы устранить эту проблему, это
resources :users
devise_for :users
Должно быть
devise_for :users
resources :users
Чтобы узнать больше о маршрутизации в Ruby on Rails, ознакомьтесь с этим руководством / руководством.
Комментарии:
1. Это было так, и это все объясняет. Спасибо!