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.

Altri articoli interessanti:

  1. IronRuby: Ruby e Rails su piattaforma .NET
  2. RVM: Installare tante versioni di Ruby e tante versioni di Rails
  3. Tutorial Pylons 1.0

Questo articolo è stato pubblicato in Web e ha le etichette , , , , , , . Aggiungi ai preferiti: link permanente. I commenti sono chiusi ma puoi lasciare un trackback: Trackback URL.
  • Inserisci il tuo indirizzo di posta per ricevere i prossimi articoli gratis:


    Servizio gestito tramite Feedburner