Ruby on Rails di norma organizza l’accesso ai controller secondo lo schema :controller/:action/:id, ad esempio http://www.example.com/post/view/29 dove post è il nome del controller, view è la action (ovvero la funzione definita all’interno del controller) e 29 è l’id del post che vogliamo visualizzare.
Cosa fare se vogliamo far rispondere un controller ad un url del tipo http://www.example.com/backoffice/post/view/29, per esempio per dividere i controller esposti al pubblico da quelli riservati agli amministratori?
Apriamo il prompt dei comandi, posizioniamoci nella cartella root del progetto e digitiamo:
ruby script generate controller 'backoffice/post'
Otteremo come risposta:
create app/controllers/backoffice
create app/helpers/backoffice
create app/views/backoffice/post
create test/functional/backoffice
create app/controllers/backoffice/post_controller.rb
create test/functional/backoffice/post_controller_test.rb
create app/helpers/backoffice/post_helper.rb
Modifichiamo il file app/controllers/backoffice/post_controller.rb per definire l’action hey:
class Backoffice::PostController < ApplicationController
def hey
render :text => "Ahoj!"
end
end
Avviamo il server, puntiamo il browser all’indirizzo http://localhost:3000/backoffice/post/hey e vedremo visualizzata la scritta:
Ahoj!
Il file config/routes.rb non è stato modificato dal momento che Rails abbina automaticamente backoffice/post e il controller Backoffice::PostController
Subcontroller nel dettaglio
Quando abbiamo lanciato il comando ruby script generate controller 'backoffice/post' sono stati creati una serie di file e cartelle:
- app/controllers/backoffice: una cartella che conterrà tutti i subcontroller del controller backoffice
- app/helpers/backoffice: una cartella che conterrà tutti gli helper dei subcontroller del controller backoffice
- app/views/backoffice/post: una cartella che conterrà tutte le view del subcontroller post
- test/functional/backoffice:una cartella che conterrà tutti test funzionali dei subcontroller
- app/controllers/backoffice/post_controller.rb: il subcontroller vero e proprio
- test/functional/backoffice/post_controller_test.rb: il test funzionale per il subcontroller post
- app/helpers/backoffice/post_helper.rb: l’helper del subcontroller post
In particolare si nota che nella cartella app/controllers, invece di generare un solo file è stata generata una cartella per il controller backoffice e all’interno il file che definisce il subcontroller post.
Ci possiamo spingere ancora più in là generando subcontroller di secondo o terzo livello:
# ruby scriptgenerate controller 'c/c1/c2'
create app/controllers/c/c1
create app/helpers/c/c1
create app/views/c/c1/c2
create test/functional/c/c1
create app/controllers/c/c1/c2_controller.rb
create test/functional/c/c1/c2_controller_test.rb
create app/helpers/c/c1/c2_helper.rb
L’annidamento dei subcontroller si riflette nell’annidamento delle cartelle generate, e soprattutto all’interno del file che definisce i differenti subcontroller. Osserviamo la prima riga dei file app/controllers/backoffice/post_controller.rb e app/controllers/c/c1/c2_controller.rb:
class Backoffice::PostController < ApplicationController
...
end
class C::C1::C2Controller < ApplicationController
...
end
Anche nella definizione dei controller la gerarchia risulta evidente.
Altri articoli interessanti:
- IronRuby: Ruby e Rails su piattaforma .NET
- RVM: Installare tante versioni di Ruby e tante versioni di Rails
- Tutorial Pylons 1.0
Questo articolo è stato pubblicato in Web e ha le etichette controller, norma, progetto, prompt dei comandi, ruby on rails, subcontroller, Tutorial. Aggiungi ai preferiti:
link permanente. I commenti sono chiusi ma puoi lasciare un trackback:
Trackback URL.
Subcontroller in Ruby on Rails
Ruby on Rails di norma organizza l’accesso ai controller secondo lo schema
:controller/:action/:id, ad esempiohttp://www.example.com/post/view/29dovepostè il nome del controller,viewè la action (ovvero la funzione definita all’interno del controller) e29è l’id del post che vogliamo visualizzare.Cosa fare se vogliamo far rispondere un controller ad un url del tipo
http://www.example.com/backoffice/post/view/29, per esempio per dividere i controller esposti al pubblico da quelli riservati agli amministratori?Apriamo il prompt dei comandi, posizioniamoci nella cartella root del progetto e digitiamo:
Otteremo come risposta:
Modifichiamo il file
app/controllers/backoffice/post_controller.rbper definire l’actionhey:Avviamo il server, puntiamo il browser all’indirizzo
http://localhost:3000/backoffice/post/heye vedremo visualizzata la scritta:Il file
config/routes.rbnon è stato modificato dal momento che Rails abbina automaticamentebackoffice/poste il controllerBackoffice::PostControllerSubcontroller nel dettaglio
Quando abbiamo lanciato il comando
ruby script generate controller 'backoffice/post'sono stati creati una serie di file e cartelle:In particolare si nota che nella cartella app/controllers, invece di generare un solo file è stata generata una cartella per il controller backoffice e all’interno il file che definisce il subcontroller post.
Ci possiamo spingere ancora più in là generando subcontroller di secondo o terzo livello:
L’annidamento dei subcontroller si riflette nell’annidamento delle cartelle generate, e soprattutto all’interno del file che definisce i differenti subcontroller. Osserviamo la prima riga dei file app/controllers/backoffice/post_controller.rb e app/controllers/c/c1/c2_controller.rb:
Anche nella definizione dei controller la gerarchia risulta evidente.
Altri articoli interessanti: