1

如果我有这条路线(在 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 的一部分,我可以为Case 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"

但是,如果参数是嵌套的(案例 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 指南没有具体说明这一点。

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

4

1 回答 1

0

你可以只做两条不同的路线

match 'posts', :to => 'posts#index'
match 'posts/:category', :to => 'posts#index'

下一条路线将无法按您的预期工作。

match 'posts(:filter[category])', :to => 'posts#index'

:filter 只是传递给 url 帮助程序的第一个参数或传入的 has 中的键 :filter 的值的占位符。不会评估路由字符串中的任何表达式。

我想你的问题的答案是你不能在 Rails 中做到这一点。我会建议您以另一种方式执行此操作。在 Rails 中遵循惯例并让自己更轻松是非常有帮助的。

看起来你在这里做三件事。基本岗位路线

match 'posts', :to => 'posts#index'

具有嵌套在其中的类别的路线。最有可能给用户一个更好的网址

match 'posts/:category', :to => 'posts#index'

以及一个可以与第一个相同的搜索 url,或者为了使您的操作更清晰,可以使用不同的搜索 url

match 'posts/search', :to => 'posts#search'

我真的没有理由按照您的建议使路线复杂化。无论如何,搜索查询 url 看起来并不好,所以为什么还要处理两个 url 进行搜索。只有一个会做。

你绝对应该看看跑步

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"

这样做是可以的。

如果您想保留 posts/:category 仅将其用于导航,而不用于搜索。

希望有帮助

于 2012-01-18T05:42:24.863 回答