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