【问题标题】:rails route mutiple globbing with optional segmentsrails 使用可选段路由多个 globbing
【发布时间】:2013-04-03 11:58:01
【问题描述】:

我有以下模式:

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"

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

我尝试将括号放在不同的位置,但没有成功。有人可以帮我解决这个问题吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    所以动作是:它看到/sort 并将其余的扔进args,完成。 Globbing 是危险的,好吧。但如果没有,它会检查/filter,并将其余的扔进它的args。因此,它使用only 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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-27
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 2015-06-12
        • 2011-10-01
        • 1970-01-01
        • 2015-02-25
        • 2013-03-24
        相关资源
        最近更新 更多