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:

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

AddThis Social Bookmark Button

Articoli simili

Commenti

Comments are closed.