我正在尝试为电影创建一个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工作。但是当用\\\转义时(它是相反的。
任何人对此都有任何提示或经验吗?
答案 0 :(得分:2)
作为一种解决方法,您可以尝试:
constraints: { id: /[A-Za-z0-9-]+(\\\(\d{4}\\\)|\(\d{4}\))/ }
也就是说,如果约束接受一个案例而另一个案例接受另一个案例,则使约束接受。
这就是说:这很奇怪,我不知道为什么Rails会这样做或如何解决它;)
答案 1 :(得分:0)
我没有很多编写正则表达式约束的经验,但你总是可以做一个通配符路由然后在控制器中清理。
match 'movies/*movie' => 'movie#action'
这样您就可以访问一个包含所有字符输入的电影参数