【问题标题】:Having a dot in the id of rails routes在 rails 路线的 id 中有一个点
【发布时间】:2011-10-17 23:46:53
【问题描述】:

我正在使用 Rails 2.3.11。如果我有一个类似 http://www.abc.com/users/e.f.json 的网址,我希望 id 为“e.f”,预期格式为“json”。有人可以建议一种方法吗? 谢谢!

【问题讨论】:

  • 我不熟悉 2.3 中的路由语法,但您可以尝试在格式中添加约束以禁止句点。这应该有助于将格式保留为仅最后一个以点分隔的段,但如果您不使用该格式,您最终会使用部分 ID 作为格式。

标签: ruby-on-rails regex routes regex-negation


【解决方案1】:

这是一个类似于 andersonvom 的解决方案,但将所有内容都集中在一个规则中(并使用一些现代 Rails 路由缩写)。

map.connect 'users/:id(.:format)', to: 'users#show', id: /.*?/, format: /[^.]+/

(注意:format前面的.

诀窍是添加一个可选格式 (.:format) 并使 id 正则表达式不贪婪,以便识别格式。如果您想为路由命名,将其保留在一条规则中很重要,这样您就可以以与格式无关的方式将其用于重定向、链接等。

【讨论】:

    【解决方案2】:

    由于 :format 约定,Rails 将解析所有参数而不带任何点。如果你愿意,你可以拥有route parameters with dots

    # You can change the regex to more restrictive patterns
    map.connect 'users/:id', :controller => 'users', :action => 'show', :id => /.*/
    

    但由于 '*' 和 '+' 正则表达式通配符都是贪婪的,它会完全忽略 (.:format) 参数。

    现在,如果您绝对需要在用户名中包含点,有一个伪解决方法可以帮助您:

    map.connect 'users/:id:format', :controller => 'users', :action => 'show', :requirements => { :format => /\.[^.]+/, :id => /.*/ }
    map.connect 'users/:id', :controller => 'users', :action => 'show'
    

    缺点是您必须在 :format 正则表达式中包含点,否则它会被用户名表达式捕获。然后你必须在你的控制器中处理点格式(例如:.json)。

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 2013-12-06
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多