0

我有以下模式:

get "/sort/*sort_params/filter/*filter_params" => "order#show"

哪个工作正常!链接被正确解析,我收到类似的东西(只是一个例子):

Parameters: {"sort_params" => "price/asc", "filter_params" => "quantity/10"}

但我并不总是需要这两个参数,所以我将这两个部分(排序和过滤器)都设为可选:

get "(/sort/*sort_params)/(filter/*filter_params)" => "order#show"

但在这里我收到以下信息:

Parameters: {"sort_parameters" => "price/asc/filter/quantity/10"}

因此,它没有正确解析最后一部分,并且由于某些原因它排成一行。

如果我删除第二部分周围的括号,如下所示:

get "(/sort/*sort_params)/filter/*filter_params" => "order#show"

然后它完全可以正常工作(当然,除了最后一部分应该存在的事实之外)!

我试过把括号放在不同的地方,但没有运气。有人可以帮我解决这个问题吗?

4

2 回答 2

2

幕后发生了一些有趣的事情。这是我在一个新应用程序(Rails 4.1)上获得的 Rails 路线的表示:

(/sort/*sort_params)(/filter/*filter_params)(.:format)

您已将这两个参数设为可选,并且唯一的分隔符/位于它们之间。它会被丢弃:在解析路线时,它会被分成类似的组/thing,而你的孤独感/不适合。

所以动作是:它看到/sort并将其余的扔进 args,完成。Globbing 是危险的,好吧。但如果没有,它会检查/filter,并将其余的扔到它的 args 中。因此,它仅用 filter or sort解释路径。不是他们两个。

我可以肯定地说,在这里使用范围就是其他人所说的 Rails 方式。这很好,鼓励使用它。但是,如果您对修复单行解决方案感兴趣,我建议您放置一个更好的分隔符,以适应该/thing形状。比如说,/list

(/sort/*sort_params)/list(/filter/*filter_params)

当然,这意味着您总是需要将其放入您的 URL 中。以下是一些正确解析的示例:

/sort/asc/list

/sort/asc/list/filter/quantity/10

/list/filter/alright

/list

这是我能想象到的最简单的解决方法。我可以想象的其他人也会使这条路线非常长,并且涉及直接声明您将在这里和那里拥有多少个参数。

但这很紧凑,对我来说看起来不错。然而,这一切都是研究。我建议使用范围。当添加其他组件时,像这样的复杂匹配更难保持一致。

于 2014-04-19T10:11:36.490 回答
0

使用范围修复它。但还是。有点好奇是否可以在一行中完成!

于 2013-04-03T13:34:11.467 回答