我有路由问题。我的路线目前看起来像这样:
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 ,过滤后的字词真的应该是查询字符串格式吗?
如果您有建议/更好的方法。提一下。
答案 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中的new
和edit
动作严格遵守REST。)
此操作需要在params
进行一些调查,以确定您是否拥有城市或类别。你可以使用这样的东西来帮助你:
@event = Event.where(:country => params[:country])
@event = @event.where(:city => params[:city]) if params[:city]
[出于某种原因,这对我来说并不合适。我想不出来。我确定这是一团糟。有人请救救我。]
但是,这就是想法。