# Routing condizionato

**URL:** <https://www.ruby-forum.com/t/routing-condizionato/160108>\
**Category:** IT\
**Created:** [February 11, 2009, 9:28pm UTC](https://www.ruby-forum.com/t/routing-condizionato/160108 "2009-02-11T21:28:45Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 11, 2009, 9:28pm UTC](https://www.ruby-forum.com/t/routing-condizionato/160108/1 "2009-02-11T21:28:45Z")

</div>

Avrei un altro problema, legato a quello di un mio post precedente  
([Ricerche condizionate in base alle categorie - IT - Ruby-Forum](http://www.ruby-forum.com/topic/178094#new)):

per generare un URL spider-friendly ho nella view la seguente linea di  
comando:  
selection\_url(:nation=\>@nation,:category=\>@category,:author=\>@author)

dove selection\_url Ã¨ definito nel file routes.rb come segue:

map.selection  
‘libri/nazionalita/:nation/genere/:category/autore/:author/elenco.html’,  
:controller=\>‘book’, :action=\>‘selection’

in tal modo possono essere generati degli url del tipo:

[http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/tutti/elenco.html](http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/tutti/elenco.html)

[http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/eliott-parker/elenco.html](http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/eliott-parker/elenco.html)

[http://127.0.0.1:3000/libri/nazionalita/inglese/genere/commedia/autore/eliott-parker/elenco.html](http://127.0.0.1:3000/libri/nazionalita/inglese/genere/commedia/autore/eliott-parker/elenco.html)

etc…

Sarebbe bello, perÃ², nel caso in cui venga selezionata solo la categoria  
o solo l’autore o solo la nazionalitÃ o solo due di queste generare URL  
del tipo:

[http://127.0.0.1:3000/libri/genere/commedia.html](http://127.0.0.1:3000/libri/genere/commedia.html)

etc…

Mi ritrovo quindi a dover affrontare un problema simile a quello del  
primo post dove cioÃ¨ dovrei generare 8 condizioni if…end e altrettante  
8 routes.

Che mi suggerite?

Grazie mille.

Luigi

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 12, 2009, 10:12am UTC](https://www.ruby-forum.com/t/routing-condizionato/160108/2 "2009-02-12T10:12:05Z")

</div>

> 8 routes.
> 
> Che mi suggerite?

La tua soluzione non sta in 8 if, ma nell’aggiunta di un semplice  
parametro.  
Quello di cui hai bisogno si chiama Shallow  
Routes[http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-shallow-routes](http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-shallow-routes),  
le quali fanno proprio quello di cui hai bisogno.

Ecco un esempio che dovrebbe riprendere il tuo caso.

map.resources :nations, _:shallow =\> true_ do |nation|  
nation.resources :genres do |genre|  
article.resources :authors  
end  
end

Aggiungendo la chiave :shallow =\> true, riesci ad ottenere quello che ti  
serve. A dir la verità non l’ho mai provato, ma confido che questa  
soluzione  
sia proprio quella che ti serva. In questo modo puoi avere URL di  
diversa  
granularità come queste

# URL completa

/nations/all/genre/commedy/authors/all

# URL parziale

/authors/all  
/genre/commedy  
/nations/all

Facci sapere!

–  
Andrea R., [http://mikamai.com](http://mikamai.com)  
Writing [http://sensejs.wordpress.com/](http://sensejs.wordpress.com/)  
Collaborating [http://therubymine.it](http://therubymine.it)  
Reading [http://stacktrace.it](http://stacktrace.it)

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [February 12, 2009, 10:13am UTC](https://www.ruby-forum.com/t/routing-condizionato/160108/3 "2009-02-12T10:13:15Z")

</div>

> 

Scusa, ho messo un article che non centra niente Ecco la versione che  
dovrebbe andare

map.resources :nations, _:shallow =\> true_ do |nation|  
nation.resources :genres do |genre|  
genre.resources :authors  
end  
end

–  
Andrea R., [http://mikamai.com](http://mikamai.com)  
Writing [http://sensejs.wordpress.com/](http://sensejs.wordpress.com/)  
Collaborating [http://therubymine.it](http://therubymine.it)  
Reading [http://stacktrace.it](http://stacktrace.it)

---

<div class="post-metadata">

**Author:** ![softwarewin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/5f9b8f/32.png) [@softwarewin](https://www.ruby-forum.com/u/softwarewin)\
**Post date:** [March 21, 2009, 3:58pm UTC](https://www.ruby-forum.com/t/routing-condizionato/160108/4 "2009-03-21T15:58:40Z")

</div>

Potreste essere un pÃ² piÃ¹ espliciti perchÃ¨ non riesco a farlo  
funzionare.

In particolare cosa dovrei scrivere esattamente nel routes e nella view?

al momento sto utilizzando questo metodo:

routes.rb

ActionController::Routing::Routes.draw do |map|

map.selection  
‘libri/nazionalita/:nation/genere/:category/autore/:author/editore/:editor/elenco.html’,  
:controller=\>‘book’,  
:action=\>‘index’

…

end

dove se viene selezionata solo il genere l’url si presenta cosÃ¬:  
[http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/tutti/elenco.html](http://127.0.0.1:3000/libri/nazionalita/tutte/genere/commedia/autore/tutti/elenco.html)

ma sarebbe piÃ¹ bello cosÃ¬:

[http://127.0.0.1:3000/genere/commedia.html](http://127.0.0.1:3000/genere/commedia.html)

Grazie dell’aiuto

Luigi
