Лучший способ направить это? - PullRequest
0 голосов
/ 24 июня 2011

У меня проблема с маршрутизацией. мои маршруты сейчас выглядят так:

http://localhost:3000/events?category=popular&city=london&country=united-kingdom 

В настоящее время он просто смотрит на ресурсы: события (то есть контроллер событий, действие индекса) и действие индекса. У меня много условий if. Особенно, когда приложение должно определить, какие партиалы загружать, основываясь на строках запроса.

Есть ли лучший способ реорганизовать это? Я не большой поклонник строк запроса в URL. И что-то подобное может быть решено в маршрутизации. Просто ищу правильное направление. Ищу URL как:

/events/london
/events/london/popular
/events/london/united-kingdom
/events/united-kingdom
/events/united-kingdom/popular
/events/london/united-kingdom/popular

В книге *1011* Anti Patterns, специально на стр. 181, предлагается создавать отдельные контроллеры. Который будет организовывать код дальше и все еще держать его ОТЛИЧНЫМ.

Теоретически, я думаю, что он предлагает что-то вроде этого:

match 'events/:city', :controller => 'events/cities', :action => 'index', :as => 'by_city', :via => :get
match 'events/:city/:category', :controller => 'events/cities_and_categories', :action => 'index', :as => 'by_city_and_category', :via => :get
match 'events/:city/:country', :controller => 'events/cities_and_countries', :action => 'index', :as => 'by_city_and_country', :via => :get
match 'events/:country', :controller => 'events/countries', :action => 'index', :as => 'by_country', :via => :get
match 'events/:country/:category', :controller => 'events/countries_and_categories', :action => 'index', :as => 'by_country_and_category', :via => :get
match 'events/:city/:country/:category', :controller => 'events/cities_and_countries_and_categories', :action => 'index', :as => 'by_city_and_country_and_category', :via => :get

ИЛИ , отфильтрованные термины ДЕЙСТВИТЕЛЬНО должны быть в формате строки запроса?

Если у вас есть предложения / лучший подход. Упомяните.

1 Ответ

1 голос
/ 25 июня 2011

Прежде всего, некоторые более чистые маршруты, которые являются более каноническими:

resources :events do
  get '/:country(/:city)(/:category)' => 'events#filtered', :on => :collection, :constrain => { :category => %w{ popular legal_marijuana } }
end

Я сделал страну обязательной. Слишком много неоднозначных названий городов, и если вы не хотите много толкать, чтобы определить сегмент, то это просто более просто. Город необязателен, как и категория.

Если я не ошибаюсь здесь, это ограничит категорию либо "популярным", либо "legal_marijuana" (но не обоими, так что Амстердам отсутствует, ха-ха).

Все эти маршруты ведут к одному действию filtered на вашем контроллере событий. Не пытайтесь сохранить этот ресурс, если для каждой страны и города не имеет смысла быть ресурсом для вашего приложения. Пока это отвечает на запрос GET и извлекает коллекцию записей, это не очень далеко от границ принципалов REST (интересное примечание, действия new и edit в Rails не придерживаются строго ОТДЫХАТЬ тоже).

Это действие нужно будет немного поковырять в params, чтобы увидеть, есть ли у вас город или категория. Вы можете использовать что-то вроде этого, чтобы помочь вам:

@event = Event.where(:country => params[:country])
@event = @event.where(:city => params[:city]) if params[:city]

[По какой-то причине мне это не кажется правильным. Я не могу думать прямо. Я уверен, что это беспорядок. Кто-нибудь, пожалуйста, спасите меня.]

Но да, это идея.

...