带约束的圆括号的ROR路线

时间:2011-07-11 22:41:18

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

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

E.g。黑衣人=> “/男性功能于黑 - (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工作。但是当用\\\转义时(它是相反的。

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

2 个答案:

答案 0 :(得分:2)

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

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

也就是说,如果约束接受一个案例而另一个案例接受另一个案例,则使约束接受。

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

答案 1 :(得分:0)

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

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

这样您就可以访问一个包含所有字符输入的电影参数