Am o eroare cu rutele/resursele și controlorii mei.
Am următoarele în routes.rb:
# routes.rb
resources :users do
resource :schedule
end
Și am un schedule_controller.rb în interiorul controllers/users/ configurat așa cum cred că ar trebui să fie:
class Users::ScheduleController < ApplicationController
# Controller methods here...
end
Rularea unui rake:routes arată
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
Cu toate acestea, navigarea către /users/:user_id/schedule returnează următoarea eroare:
uninitialized constant SchedulesController
Singurele mele gânduri cu privire la ceea ce ar putea fi problema sunt că are ceva de-a face cu resursele imbricate sau cu declararea unei singure resurse și că eu greșesc undeva.
Folosesc helper-ul
new_user_schedule_path(current_user)
atunci când fac legătura cu „noua” mea vizualizare.
- Observați că ScheduleController nu este SchedulesController. – > Por matt.
- Am ajuns la această întrebare căutând eroarea din titlu, dar fără a avea imbricate vs namespaced resurse. În cazul meu fișierul controler nu a fost plasat în folderul corect. – > Por stralsi.
- În cazul meu, numele fișierului controlerului nu era în formatul corect. Numele fișierului ar trebui să fie „schedules_controller.rb” – > Por amayer171292591.
Ar trebui să fie SchedulesController
, , nu Users::ScheduleController
. Controlorii ar trebui să fie namespaced numai atunci când traseul este namespaced cu namespace
. De asemenea, numele controlorilor trebuie să fie întotdeauna la plural.
Ceea ce creați este un imbricate resursa, și nu una cu nume.
- Exemplul de resursă la singular din ghid de rutare are un nume de clasă la plural, așa că mă aștept ca Andrew să aibă dreptate, iar numele controlerului tău să fie la plural. – > .
- Uneori, pluralul este greșit, în special în cazul pluralului complex sau al cuvintelor compuse. În aceste cazuri, puteți modifica fișierul inflections.rb astfel încât rails să caute „pluralul”. – > .
- Vă mulțumim pentru răspuns. Într-adevăr, am confundat resursele imbricate și namespacing. De asemenea, utilizarea unui „program” la singular a cauzat, de asemenea, probleme. – > .
Este namespacing-ul din SchedulesController
intenționată? într-adevăr intenționați să faceți acest lucru?
class Users::SchedulesController < ApplicationController
Sau faceți asta doar pentru că programele sunt un „sub-catârg” de la utilizatori?
Motivul pentru care întreb acest lucru este pentru că, de obicei, în cadrul Rails, controlorii de resurse imbricate nu sunt nu sunt spațiate prin nume. Ați numi un controler namespace doar dacă ați dori să modificați controlorii într-un mod special sub un namespace. Un exemplu obișnuit ar fi acela de a avea niște controlori sub un namespace de administrare, care moștenesc de la un controler BaseController
în cadrul acelui spațiu de nume, care ar restricționa accesul numai pentru administratori la acei controlori.
Opțiunea 1
În cazul în care nu ați intenționat namespace acest controler, atunci doriți să eliminați Users::
din controlerul dvs. și mutați-l înapoi la app/controllers/schedules_controller.rb
, și ajutoarele înapoi la app/helpers/schedules_helper.rb
iar vizualizările înapoi la app/views/schedules
. Poate că ați rulat un generator care a generat, de asemenea, un Users::Schedule
care, de asemenea, ar trebui să fie redenumit în Schedule
și mutat înapoi la app/models/schedule.rb
.
Opțiunea 2
În cazul în care ați făcut-o intenționat namespace acest controler, atunci doriți să faceți acest lucru în rutele dumneavoastră:
namespace :users do
resources :schedules
end
Lăsați tot ceea ce a fost generat așa cum ar trebui să fie.
În routes.rb trebuie să specificați controlerul în felul următor:
resources :users do
resource :schedules, controller: 'users/schedules'
end
- Acesta ar trebui să fie răspunsul acceptat, deoarece se pare că solicitarea inițială a fost pentru o resursă imbricata – nu una cu spațiu de nume. Dacă nu specificați controlerul în resursa imbricata, așa cum s-a făcut aici, veți primi eroarea pe care a întâlnit-o autorul original. – > .
înlocuiți resursele :users cu namespace :users
Deoarece controlerul de planificare este în interiorul folderului users.class Users::ScheduleController < ApplicationController # Metodele controlerului aici…end