#ruby_on_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 %>
Ответы
Ответ 1
Возьмите ваш маршрут 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}/ } Это единственный выход, когда маршруты сильно перекрываются. Это не ваш случай, в вашем случае достаточно изменить порядок. Но только первого приёма для разруливания таких проблем в общем случае недостаточно.
Комментариев нет:
Отправить комментарий