Subcontroller in Ruby on Rails
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.
2 Settembre 2007
Categorie: Tutorial, Ruby on Rails
Articoli simili
- RailsRumble 2008: prime notizie
- Rails 2.1 disponibile
- jRuby 1.1.2 e Ruby 1.8.7 preview
- Rails 2.1 e ottimizzazione Active Record
- RailsConf 2008 live da Wave Factory e GotThingsDone.com