如何匹配Rails3中的哈希(深嵌套)参数来创建一个漂亮的URL?

时间:2011-09-13 15:06:46

标签: ruby-on-rails ruby-on-rails-3 params rails-routing

如果我有这条路线(在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没有指定对此的反对意见。

我应该假设这不能在铁轨中完成吗?真的?

1 个答案:

答案 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"

可以这样做。

如果你想保留帖子/:类别只是用于导航,而不是用于搜索。

希望有所帮助