web-dev-qa-db-fra.com

Constante non initialisée "Nom du contrôleur"

Je rencontre une erreur avec mes routes/ressources et contrôleurs.

J'ai les éléments suivants dans le fichier routes.rb:

# routes.rb
resources :users do  
  resource :schedule  
end

Et j'ai un schedule_controller.rb à l'intérieur des contrôleurs/utilisateurs/mis en place comme je pense qu'il devrait être:

class Users::ScheduleController < ApplicationController

  # Controller methods here...

end

Lancer un rake: itinéraires spectacles 

user_schedule      POST   /users/:user_id/schedule(.:format)       schedules#create
new_user_schedule  GET    /users/:user_id/schedule/new(.:format)   schedules#new
edit_user_schedule GET    /users/:user_id/schedule/edit(.:format)  schedules#edit
                   GET    /users/:user_id/schedule(.:format)       schedules#show
                   PUT    /users/:user_id/schedule(.:format)       schedules#update

Cependant, en accédant à/users /: user_id/schedule renvoie l'erreur suivante:

uninitialized constant SchedulesController

Ma seule pensée sur le problème qui pourrait se poser est que cela a quelque chose à voir avec les ressources imbriquées ou la déclaration d'une ressource unique et que je me trompe quelque part.

J'utilise l'aide 

new_user_schedule_path(current_user)

lors de la liaison à ma "nouvelle" vue.

15
Adam

Ce devrait être SchedulesController, pas Users::ScheduleController. Les contrôleurs ne doivent être nommés que lorsque la route est namespaced avec namespace . Les noms de contrôleurs doivent également toujours être au pluriel.

Ce que vous créez est une ressource nested , et non pas un espace de noms.

15
Andrew Marshall

Le nom de la variable SchedulesController est-il intentionnel? c'est-à-dire vraiment avez-vous l'intention de faire cela?

class Users::SchedulesController < ApplicationController

Ou faites-vous cela uniquement parce que les horaires sont une "sous-chose" des utilisateurs?

La raison pour laquelle je pose cette question est parce que généralement, dans Rails, les contrôleurs de ressources imbriqués ne sont pas namespaced. Si vous souhaitez modifier les contrôleurs de manière spéciale sous un espace de nom, vous ne souhaitez modifier un contrôleur d'espace de noms. Un exemple courant serait d'avoir certains contrôleurs sous un espace de noms d'administrateur, héritant d'une variable BaseController au sein de cet espace de noms, qui empêcherait uniquement les administrateurs d'accéder à ces contrôleurs.

Option 1

Si vous n'avez pas intentionnellement namespace ce contrôleur, vous souhaitez supprimer le préfixe Users:: de votre contrôleur et le ramener à app/controllers/schedules_controller.rb, les aides à app/helpers/schedules_helper.rb et les vues à app/views/schedules. Peut-être avez-vous exécuté un générateur qui a également généré un modèle Users::Schedule, qui devrait également être renommé en Schedule et redescendu en app/models/schedule.rb.

Option 2

Si vous avez intentionnellement namespace ce contrôleur, alors vous voulez le faire dans vos routes:

namespace :users do
  resources :schedules
end

Laissez tout ce qui a été généré comme il se doit.

3
Ryan Bigg

Dans votre fichier routes.rb, vous devez spécifier le contrôleur de la manière suivante:

resources :users do resource :schedules, controller: 'users/shedules' end

1
Pshemski

remplacer les ressources: utilisateurs en namespace: utilisateurs

Parce que votre contrôleur de planification se trouve dans le dossier users . Class Users :: ScheduleController <ApplicationController # Méthodes de contrôleur ici ... Fin

0
Hemant Kumar