Rails: как обрабатывать вложенные маршруты между штатами и городами - PullRequest
0 голосов
/ 08 ноября 2011

Я новичок в Rails (использую 3.1) и ищу URL, который выглядит примерно так:

domain.com / работа / Флорида / орландо

Я понимаю, что это выходит за рамки типичного маршрута с действием и одним идентификатором, так каков наилучший способ сделать это? Подпадает ли это под вложенную маршрутизацию?

Более подробно - если кто-то перейдет на страницу / jobs, он увидит список состояний. Если они попадут на страницу / jobs / florida, они увидят список городов. И, наконец, если они нажмут на / jobs / florida / orlando, они увидят список вакансий, открытых в Орландо.

Как бы выглядел мой маршрут? Должен ли я думать об этой структуре URL по-другому? Моя основная мотивация - SEO - эти страницы, как правило, не будут просматриваться зарегистрированными пользователями, только если они найдут сайт в результате поиска.

Спасибо!

Ответы [ 3 ]

1 голос
/ 08 ноября 2011

Вы должны взглянуть на динамические сегменты из направляющих рельсов.В основном ваш пример должен иметь маршрут, подобный следующему:

get "/jobs(/:state(/:city))", :to => "jobs#index"

и в вашем действии index в JobsController вы проверяете, выбрано ли у вас штат и выбран город.Если да, то вы отображаете список заданий из этого региона, если нет, тогда вы показываете более глубокий уровень вложенности, чем ваш текущий уровень.

Если это поможет, вы можете распространить этот маршрут на 3 разных:

get "/jobs", :to => "jobs#index_without_state"
get "/jobs/:state", :to => "jobs#index_without_city"
get "/jobs/:state/:city", :to => "jobs#index"

или как вы чувствуете, но я думаю, что он чрезмерно спроектирован и первое предложение не должно быть намного сложнее для реализации (особенно когда вы можете извлечь некоторую логику для before_filters, если у вас есть определенный сегмент из маршрута)

1 голос
/ 08 ноября 2011

У меня была похожая проблема, и я решил ее следующим образом:

resources :jobs do
  collection do
    constraints :state_id => /[a-z\-]+/ do
      get ':state_id' => 'states#show', :as => :state
      get ':state_id/:city_id' => 'cities#show', :as => :city
    end
  end
end
  • /jobs перейдет к jobs#index

У вас не должно быть номеров в названиях городов / штатов!

  • /jobs/florida переходит к states#show с state_id = florida

  • /jobs/new-york переходит к states#show с помощью state_id = Нью-Йорк

  • /jobs/florida/orlando идет к cities#show с city_id = orlando

Теперь самое интересное! Вы также можете использовать слизней для своей работы:

  • /jobs/1234-experienced-senior-programmer идет к jobs#show с 1234-experienced-senior-programmer в качестве идентификатора, просто наберите params[:id].to_i, и вы получите идентификатор 1234:)

Не очень веселая часть:

методы сбора, такие как /jobs/new, больше не будут работать - вы можете изменить это, добавив квантификатор, такой как :state_id => /[a-z\-]{4,}/, поэтому для этого необходимо, чтобы имена состояний имели как минимум 4 символа, и все трехбуквенные методы сбора, такие как new, будут, как обычно, передаваться в контроллер заданий

сгенерированные маршруты:

state_jobs GET    /jobs/:state_id(.:format)     {:controller=>"states", :state_id=>/[a-z\-]+/, :action=>"show"}
 city_jobs GET    /jobs/:state_id/:city_id(.:format) {:controller=>"cities", :state_id=>/[a-z\-]+/, :action=>"show"}
      jobs GET    /jobs(.:format)               {:controller=>"jobs", :action=>"index"}
           POST   /jobs(.:format)               {:controller=>"jobs", :action=>"create"}
   new_job GET    /jobs/new(.:format)           {:controller=>"jobs", :action=>"new"}
  edit_job GET    /jobs/:id/edit(.:format)      {:controller=>"jobs", :action=>"edit"}
       job GET    /jobs/:id(.:format)           {:controller=>"jobs", :action=>"show"}
           PUT    /jobs/:id(.:format)           {:controller=>"jobs", :action=>"update"}
           DELETE /jobs/:id(.:format)           {:controller=>"jobs", :action=>"destroy"}
0 голосов
/ 08 ноября 2011

Вы можете сделать это в вашем файле rout.rb, если у вас фиксированная глубина

match 'jobs/:state/:city/:neighborhood' => "Jobs#show"

В вашем действии show вы можете искать params [: state], params [: city] и т. Д.и загрузите соответствующие задания.

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