rails路由多个globbing与可选段

时间:2013-04-03 11:58:02

标签: ruby-on-rails ruby routes rails-routing glob

我有以下模式:

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"

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

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

2 个答案:

答案 0 :(得分:2)

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

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

您已将两个参数设为可选,并且唯一的分隔符是它们之间的/。并且它被丢弃:虽然解析路线被分成像/thing这样的组,而你孤独的/也不适合。

所以行动是:它看到/sort并将其余部分扔进args,完成。 Globbing很危险。但是如果它没有,它会检查/filter,并将其余的东西扔进它的args中。因此,它仅使用 filter sort来解释路径。不是两个都。

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

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

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

/sort/asc/list

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

/list/filter/alright

/list

这是我能想象到的最简单的解决方案。我可以想象的其他一些路线疯狂很长,直接宣告你将会在这里和那里拥有多少args。

但这很紧凑,对我来说很好看。然而,所有这些都是研究。 我建议使用范围。这样的复杂匹配在添加其他组件时难以保持一致。

答案 1 :(得分:0)

使用范围修正了它。但仍然。有点好奇,如果有可能在一行做!