Объединение маршрутов в Rails? - PullRequest
0 голосов
/ 21 июля 2009

Я пишу сайт со списком конференций в Rails, и столкнулся с этим требованием:

цепочка, в произвольном порядке, URL для поиска событий, например:

/ в /: город / на /: Тег / с /: динамик

или переставить как

/ в /: город / с /: динамик / вкл /: тег

Я могу справиться с этими штрафами один за другим. Есть ли способ динамически обрабатывать эти запросы?

1 Ответ

0 голосов
/ 21 июля 2009

Я добился этого с помощью следующего (извините за некоторый специфичный для приложения код):

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]
      }
  }

это дает мне URL-адреса, такие как / conference / in / salt_lake_city / with / joe_shmoe или / lectures / about / программирования / with / joe_splo /, в произвольном порядке выиграть!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...