Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

Почему перестал работать выход с сайта Rails (devise)?

Здравствуйте, скажите пожалуйста как исправить ошибку. При выходе с сайта выкидывает сообщение - Couldn't find Doctor with 'id'=sign_out и указывает на строку
@doctor = Doctor.find(params[:id])
в контроллере
class DoctorsController < ApplicationController before_action :set_doctor, only: [:show, :edit, :update, :destroy] def index @doctor = Doctor.all end
def show @length = User.where(doctor_id: params[:id]).size end
private
def set_doctor @doctor = Doctor.find(params[:id]) end end
Раньше с сайта выходил, но теперь такая возможность пропала. Использую гем Devise
UPDATE routes.rb
Rails.application.routes.draw do get 'contact/index'
resources :news resources :prices get 'healthy/index' get 'about/index'
resources :users resources :doctors
devise_for :doctors, :controllers => { registrations: 'registrations' } root 'users#main'
end
Ссылка на выход из сессии
<%= link_to 'Вийти', destroy_doctor_session_path %>


Ответ

Возьмите ваш маршрут GET /doctors/sign_out и смотрите по списку сверху вниз, по какому правилу он совпадёт первым.
И совпадает он с GET /doctors/:id, собранным из resources :doctors. Почему не GET /doctors/sign_out (из devise_for), если он подходит лучше? А неважно, он первый подходящий. Он и используется.
Решение простое — поместите вызов devise_for выше resources :doctors, тем самым изменив порядок этих маршрутов в списке так, чтобы первым совпадал GET /doctors/sign_out

Альтернативно, повышенной сложности: не меняя порядок, установите к параметру :id в маршруте требование состоять только из цифр, аналогично примеру из документации
get 'photos/:id', to: 'photos#show', constraints: { id: /[A-Z]\d{5}/ }
Это единственный выход, когда маршруты сильно перекрываются. Это не ваш случай, в вашем случае достаточно изменить порядок. Но только первого приёма для разруливания таких проблем в общем случае недостаточно.

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

Отправить комментарий