0

RESTful な目的のために、ルーティングを次のように作成しました。

ルート.rb

match 'shops/:sort/:genre/:area', :to => 'shops#index'  

しかし、ジャンルが空の場合はどうなるでしょうか? にリダイレクトされexample.com/shops/newest_first//californiaませんか?

この種のルーティングとパラメーターの問題を解決するにはどうすればよいですか? 誰かが私に良い例を示すことができますか?

見る

<%= form_tag shops_path, :method => :get do %>
    <%= select_tag :sort, options_from_collection_for_select(Sort.all, 'id', 'name', params[:sort]), :prompt => "Newest first" %>
    <%= select_tag :genre, options_from_collection_for_select(Genre.all, 'id', 'name', params[:genre]), :prompt => "all" %>
    <%= select_tag :area, options_from_collection_for_select(Area.all, 'id', 'name', params[:area]), :prompt => "all" %>
<% end %>

別のビュー

4

1 に答える 1

2

安らかなルーティングは最も直感的で慣習的ですが、必ずしも私たちのニーズに合うとは限りません。

あなたの場合、厳密な安らかなルートの代わりにクエリパラメーターを使用することをお勧めします。

example.com/shopssortgenreおよびの3 つのクエリ パラメータを受け取るareaため、URL は次のようになります。example.com/shops?area=california&sort=newest_first

コントローラーのインデックス アクションでは、次の方法でこれらのパラメーターの存在を照会できます。

def index
  if !params[:sort].blank?
    @shops = @shops.sort(params[:sort])
  end
  if !params[:area].blank?
    @shops = @shops.where(:area => params[:area])
  end
  .
  .
  .
end

このようにして、コントローラーのパラメーターの欠落から十分に保護されますが、ユーザーが要求するデータは何でも提供できます。

params余談ですが、使用しているハッシュに、受け入れる意思のある値のみが含まれていることを確認してください。

于 2013-01-09T14:28:55.750 に答える