Padrino路由可选参数配置报错,Mustermann提示参数缺失求助
看起来你在Padrino路由的可选参数配置上踩了个小坑——问题出在你把可选参数的括号语法直接混进了:with选项里,Mustermann(Padrino底层的路由匹配库)把'(:search)'当成了一个必须的参数键,而不是可选参数的标记,所以才会报错说你没提供:search参数。
我来给你梳理下正确的配置方式:
正确的可选路由参数配置
Padrino里的可选参数是通过在路径模式里用括号包裹来定义的,而不是在:with选项里混合符号和字符串。你可以这样改写路由:
# 方式1:直接定义路径并映射到命名路由 get '/sort/:order/:asc(/:search)', :map => :sort # 方式2:用命名路由的path选项 get :sort, :path => '/sort/:order/:asc(/:search)'
这里的(/:search)就表示:search是可选参数——当你不传这个参数时,路由会匹配/sort/:order/:asc;传了的话就匹配/sort/:order/:asc/:search。
为什么之前的写法会报错?
你原来的配置get :sort, :with => [:order, :asc, '(:search)']有两个问题:
:with选项的作用是声明路由接受的参数列表,它只接受参数名称的符号,不能直接放带括号的字符串语法- Mustermann把
'(:search)'解析成了一个名为(:search)的参数键(注意带括号的名称),所以它认为你必须提供这个参数,而你调用url时没传,就触发了错误
调用url方法的正确姿势
现在路由配置正确后,调用url时可选参数可传可不传:
# 不传search,生成URL: /sort/id/[你的@asc值] url(:sort, :order => "id", :asc => @asc) # 传search,生成URL: /sort/id/[你的@asc值]/my-search-content url(:sort, :order => "id", :asc => @asc, :search => "my-search-content")
如果一定要用:with选项(其实通常不需要,因为路径里已经定义了参数),可以这样写,确保只放参数符号:
get :sort, :path => '/sort/:order/:asc(/:search)', :with => [:order, :asc, :search]
这样配置后,Mustermann就能正确识别哪些参数是可选的,不会再抛出错误啦。
内容的提问来源于stack exchange,提问作者Mlok
相关产品推荐
相关产品推荐

