Страницы

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

воскресенье, 15 марта 2020 г.

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

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

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

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