0

ルートの「途中」にあるオプションのルート パラメータに制約を設定することは可能ですか?

次のルートを希望します。

get ':city(/:suburb)/:venue_type', venue_type: /bar|restaurant|cafe/

これにより、市内にある特定のタイプの会場のリストが表示されるか、オプションで郊外に絞り込まれます。:venue_types私がサポートしているのはbar, restaurantとだけですcafe

今、私は次のマッピングを達成したいと思います:

/nyc/manhattan/bar -> :city = nyc, :suburb = manhattan, :venue_type = bar
/nyc/bar           -> :city = nyc, :suburb = (nil),     :venue_type = bar
/nyc/whatever/cafe -> :city = nyc, :suburb = whatever,  :venue_type = cafe
/nyc/whatever      -> :city = nyc, :suburb = whatever,  :venue_type = (nil) - routing error

これまでのところ、私は仕事をしない次のことを試しました:

class ValidSuburb
  INVALID = %w[bar restaurant cafe]
  def self.matches?(request)
    request.params.has_key?(:suburb) && !INVALID.include?(request.params[:suburb])
  end
end
get ':city(/:suburb)/:venue_type', venue_type: /bar|restaurant|cafe/, suburb: ValidSuburb.new

制約によってこれを達成することは可能ですか、それとも複数のルートを持つことに頼る必要がありますか?

4

1 に答える 1

1

何かが足りないのかもしれませんが、ルートを 2 つだけにした方が簡単ではないでしょうか?

get ':city/:venue_type', constraints: { venue_type: /bar|restaurant|cafe/ }
get ':city/:suburb/:venue_type', constraints: { venue_type: /bar|restaurant|cafe/ }

ここで"bar"、 、"restaurant"、または以外が の"cafe"後にそのフラグメントとして渡された/nyc/.../bar場合、最初のルートはスキップされ、2 番目のルートに一致します。

が渡された場合/nyc/whatever、どちらのルートの制約/形式も満たせず、後で RouteError が発生します。

于 2013-09-03T00:32:07.020 に答える