Routing condizionato


#1

Avrei un altro problema, legato a quello di un mio post precedente
(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/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

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


#2

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
Routeshttp://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
Writing http://sensejs.wordpress.com/
Collaborating http://therubymine.it
Reading http://stacktrace.it


#3

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
Writing http://sensejs.wordpress.com/
Collaborating http://therubymine.it
Reading http://stacktrace.it


#4

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

ma sarebbe più bello così:

http://127.0.0.1:3000/genere/commedia.html

Grazie dell’aiuto

Luigi