RoR, разработка: маршрут для входа перенаправляет пользователям #показать

#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. Это было так, и это все объясняет. Спасибо!