2011-06-24 4 views
0

ルーティングに関する問題があります。これを進める方がいいですか?

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

は現在、そのわずかなリソースを見て::イベント(イベントコントローラ、indexアクションである)、およびindexアクションで私のルートは現在このように見えます。私はif条件をたくさん持っています。特に、アプリケーションがクエリ文字列に基づいて読み込む部分文字列を判断する必要があるとき。

これをリファクタリングするには良い方法がありますか?私はURLのクエリ文字列の大ファンではありません。そして、このようなものはルーティングで解決することができます。ちょうど正しい方向を探しています。以下のようなURL持って探しています:具体的には、181ページの

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

Anti Patterns bookは、別々のコントローラを作成示唆しています。それはコードをさらに整理し、それを依然として恒久的に保ちます。 が本当には、クエリ文字列の形式にすることになっ

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

まず第一に、より標準的ないくつかのルートクリーナー:

私は必要な国を作った
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] 

[これは私には似ていません。私はまっすぐ考えることができません。私はこれが混乱であると確信しています。誰かが私を救ってください。]

しかし、ええ、それはアイデアです。

関連する問題