2009-07-20 9 views
0

J'écris une conférence, une liste de site Web Rails, et suis tombé sur cette exigence:Route enchaînant dans Rails?

chaîne

, sans ordre particulier, une URL pour trouver des évènements tels que:

/dans /: ville/sur /: tag/avec /: haut-parleur

ou réarrangés comme

/dans /: ville/avec /: haut-parleur/sur /: tag

je peux gérer ces fins un par un. existe-t-il un moyen de gérer dynamiquement ces demandes?

Répondre

0

je l'ai réalisé avec les éléments suivants (en excuse de code spécifique à l'application là-bas):

routes.rb:

map.connect '/:type/*facets', :controller => 'events', :action => 'facets' 

events_controller.rb:

def facets 
    @events = find_by_facets(params[:facets], params[:type]) 
    render :action => "index" 

    end 

application_controller.rb :

def find_by_facets(facets, type = nil) 
query = type.nil? ? "Event" : "Event.is('#{type.singularize.capitalize}')" 
for i in (0..(facets.length - 1)).step(2) 
    query += ".#{facets[i]}('#{facets[i+1].to_word.capitalize_words}')" 
end 
@events = eval(query) 

end 

event.rb:

named_scope :in, lambda { |city| { :conditions => { :location => city } } } 

    named_scope :about, lambda { 
     |category| { 
      :joins => :category, 
      :conditions => ["categories.name = ?", category] 
     } 
    } 

    named_scope :with, lambda { 
     |speaker| { 
      :joins => :speakers, 
      :conditions => ["speakers.name = ?", speaker] 
     } 
    } 

    named_scope :on, lambda { 
     |tag| { 
      :joins => :tags, 
      :conditions => ["tags.name = ?", tag] 
     } 
    } 

    named_scope :is, lambda { 
     |type| { 
      :joins => :type, 
      :conditions => ["types.name = ?", type] 
     } 
    } 

cela me donne des URL comme/conférences/dans/salt_lake_city/avec/ou joe_shmoe/conférences/A propos/programmation/avec/joe_splo /, sans ordre particulier. gagner!