2009-08-12 8 views
1

Gibt es im Routing-Framework von Ruby On Rails eine Möglichkeit, basierend auf einer bestimmten Logik eine Entscheidung darüber zu treffen, welcher Controller oder welche Aktion auf einer einzigen Route aufgerufen werden soll?Ruby On Rails Routing mit Geschäftslogik

Zum Beispiel, sagen wir mal eine URL zip/354 und ich möchte die foo Aktion nennen, wenn die ganze Zahl selbst und die bar Aktion ist, wenn die ganze Zahl ungerade ist. So verwenden pseudo-Rubin:

map.connect 'zip/:id', :requirements=>{:id=>/^\d+$/} do |id| 
    :controller=>'c', :action=>'foo' if id.to_i % 2 == 0 
    :controller=>'c', :action=>'bar' if id.to_i % 2 != 0 
end 

Antwort

4

Ich bin nicht sicher, ob die Routing-Seite der Dinge, aber man könnte die Aktion Anruf eine andere Aktion basiert haben auf: id

def zip 
    id = params[:id].to_i 
    if(id%2 == 0) 
    foo 
    else 
    bar 
    end 
end 

Aber man kann allerdings von das schon.

3

habe ich versucht, ein kleines Experiment mit meinen Routen und dies schien

# route to the even action 
map.connect 'foo/:code', :controller => 'bar', 
     :action => 'even', :requirements => { :code => /\d+(2|4|6|8|0)/ } 

# route to the odd action 
map.connect 'foo/:code', :controller => 'bar', 
     :action => 'odd', :requirements => { :code => /\d+(1|3|5|7|9)/ } 

Es scheint ein wenig hacky mich zu arbeiten, und ich will nicht behaupten, dass es wahrscheinlich ziemlich zerbrechlich ist, aber es macht den Job bekommt erledigt.

bearbeitet: ich keinen Anker gelegt habe (^ oder $) in den Strecken, weil sie nicht in den Routing-Anforderungen sind nicht zulässig. Der Rahmen bedeutet, dass sie da sind. So nach dem Routing-Parser,

/\d+(1|3|5|7|9)/ == /^\d+(1|3|5|7|9)$/