是否可以对可选路由参数设置约束,该参数在路径的中间中为'?
我想有以下路线:
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
这是否可以通过约束来实现,还是我必须求助于多条路线?
答案 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。