在Rails路由中间具有约束的可选参数

时间:2013-09-02 23:36:43

标签: ruby-on-rails routing constraints

是否可以对可选路由参数设置约束,该参数在路径的中间中为'?

我想有以下路线:

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

这将显示位于城市中的特定类型的场地列表,或者可选地将其缩小到郊区。我支持的唯一:venue_typesbar, restaurantcafe

现在我想实现以下映射:

/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

这是否可以通过约束来实现,还是我必须求助于多条路线?

1 个答案:

答案 0 :(得分:1)

也许我错过了一些东西,但是只有两条路线会不会更简单?

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之后作为该片段传递,则会跳过第一条路线,使其与第二条路线。

如果/nyc/whatever通过,它就不会遇到任何一条路线的约束/格式,导致您之后的RouteError。