我有以下模式:
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"
然后它完全正常(除了最后一部分应该存在的事实,当然)!
我尝试在不同的地方放置括号,但没有运气。有人可以帮我解决这个问题吗?
答案 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)
使用范围修正了它。但仍然。有点好奇,如果有可能在一行做!