更好的方式来路由这个?

时间:2011-06-24 19:49:47

标签: ruby-on-rails-3 routing routes url-routing

我有路由问题。我的路线目前看起来像这样:

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

目前只关注资源:事件(事件控制器,索引操作)和索引操作。我有很多if条件。特别是,当应用程序需要根据查询字符串确定要加载哪些部分时。

有没有更好的方法来重构这个?我不是URL中查询字符串的忠实粉丝。这样的事情可以在路由中解决。只是寻找正确的方向。我希望网址像:

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

Anti Patterns book,特别是第181页,建议创建单独的控制器。这将进一步组织代码并仍然保持RESTFUL。

从理论上讲,我认为它暗示了这样的事情:

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

OR ,过滤后的字词真的应该是查询字符串格式吗?

如果您有建议/更好的方法。提一下。

1 个答案:

答案 0 :(得分:1)

首先,一些更规范的清洁路线:

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

我已经把这个国家变成了必需品。有太多模棱两可的城市名称,除非你想做很多寻找确定段是什么,这只是更直接。这个城市是可选的,类别也是如此。

除非我在这里弄错了,否则这会将类别限制为“流行”或“legal_marijuana”(但不是两者都有,所以阿姆斯特丹出局了,哈哈)。

所有这些路由都会转到事件控制器上的单个filtered操作。除非每个国家和城市都有适合您应用的资源,否则不要费心去保持这种资源。只要这响应一个GET请求,并且它检索一组记录,它就不会远远超出REST主体的范围(有趣的是,Rails中的newedit动作严格遵守REST。)

此操作需要在params进行一些调查,以确定您是否拥有城市或类别。你可以使用这样的东西来帮助你:

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

[出于某种原因,这对我来说并不合适。我想不出来。我确定这是一团糟。有人请救救我。]

但是,这就是想法。