如果我有这条路线(在routes.rb中):
match 'posts', :to => 'posts#index'
它将显示并匹配以下路线:
# Case 1: non nested hash params
posts_path(:search => 'the', :category => 'old-school')
#=> "/posts?search=the&category=old-school"
# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts?filter[search]=the&filter[category]=old-school"
如果我想将类别参数作为主URL的一部分,我可以为案例1 执行此操作。
match 'posts(/:category)', :to => 'posts#index'
将显示和匹配以下路线:
# Case 1: non nested hash params
posts_path(:search => 'the', :category => 'old-school')
#=> "/posts/old-school?search=the"
但如果param嵌套( Case 2 ),我怎么能这样做呢?
我希望下一个路线定义:
match 'posts(/:filter[category])', :to => 'posts#index'
以这种方式工作:
# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts/old-school?filter[search]=the"
但它不起作用。
我在两个地方找到了同样的问题但没有回答:
Rails Guides没有指定对此的反对意见。
我应该假设这不能在铁轨中完成吗?真的?
答案 0 :(得分:0)
你可以改为两条不同的路线
match 'posts', :to => 'posts#index'
match 'posts/:category', :to => 'posts#index'
下一条路线无法按预期工作。
match 'posts(:filter[category])', :to => 'posts#index'
:filter只是传递给url助手的第一个参数或者key的值的占位符:传入的has中的过滤器。路径字符串中的任何表达式都不会被计算。< / p>
我想你的问题的答案是你不能在rails中做到这一点。我会建议你,虽然你以另一种方式这样做。在rails中遵循惯例并使自己更容易,这非常有帮助。
看起来你在这里做了三件事。基地岗位路线
match 'posts', :to => 'posts#index'
具有嵌套在其中的类别的路线。最有可能为用户提供更好的网址
match 'posts/:category', :to => 'posts#index'
一个搜索网址可以与第一个搜索网址相同,或者使您的操作更清洁,另一个搜索网址
match 'posts/search', :to => 'posts#search'
我真的没有理由想到以你建议的方式使路线复杂化。搜索查询网址看起来不太好看,所以为什么还要费心处理两个网址进行搜索。只有一个人会这样做。
你一定要看看跑步
rake routes
因为这将告诉您在路线文件中确切定义的内容。您还可以设置路由测试以确保自定义路由正常运行。
您的示例不起作用(如您所示)
# Case 2: nested hash params
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts/old-school?filter[search]=the"
但你应该寻找的是这个
posts_path(:filter => {:search => 'the', :category => 'old-school'})
#=> "/posts?filter[search]=the&filter[category]=old-school"
可以这样做。
如果你想保留帖子/:类别只是用于导航,而不是用于搜索。
希望有所帮助