【问题标题】:ROR route with parentheses in constraint带括号的 ROR 路由约束
【发布时间】:2011-07-11 22:41:17
【问题描述】:

我正在尝试为电影(在根路径上)创建一个轨道路线,其中包含包含电影年份的括号。

例如黑衣人 => "/men-in-black-(1997)"

我的路线是:

resources :movies,
  path:'/',
  only:[ :index, :list, :show ],
  constraints: { id: /[A-Za-z0-9-]+\(\d{4}\)/ }

当我使用这条路线 (movie_path(Movie.first)) 时,我得到了

"ActionController::RoutingError: No route matches: ..."

当我将路由约束更改为:

constraints: { id: /[A-Za-z0-9-]+\\\(\d{4}\\\)/ }

使用 url 路由助手时,该路由有效。但是,该路由不适用于反向映射(例如,采用“/men-in-black-(1997)”并将其路由到正确的操作/控制器)。当我运行时(从控制台):

Rails.application.routes.recognize_path("/men-in-black-(1997)")

我遇到同样的路由错误:

ActionController::RoutingError: No route matches

这个问题似乎与 rails 如何在路由中转义正则表达式有关。对于使用 \( 转义,对象到路由映射失败,但 url-to-route 有效。但是当使用 \\\( 转义时,情况正好相反。

有人对此有任何提示或经验吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 routing


    【解决方案1】:

    作为一种解决方法,您可以尝试:

    constraints: { id: /[A-Za-z0-9-]+(\\\(\d{4}\\\)|\(\d{4}\))/ }
    

    也就是说,如果约束在一种情况下接受一个,而在另一种情况下接受另一个,则让约束接受。

    也就是说:这很奇怪,我不知道 Rails 为什么会这样做或如何解决它;)

    【讨论】:

      【解决方案2】:

      好吧,我没有太多编写正则表达式约束的经验,但你总是可以做一个通配符路由,然后在控制器中进行清理。

      match 'movies/*movie' => 'movie#action'
      

      这将使您可以访问包含所有字符输入的 :movie 参数

      【讨论】:

      • 不幸的是,出于 seo 目的,我需要从根路径路由电影。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多