我是Rails的新手,在阅读了一些Rails路由文档之后,我仍然无法弄清楚为什么我的路径会被这样对待:
通过以下示例,Rails抱怨它无法找到id
等于“inception”的电影,即使我尝试传递id参数。
(我正在路由的controller#action
属于resources
- 类型show
)。
的routes.rb
1:get 'movies/inception' => "movies#show", :id => 6
2:get 'movies/inception' => 'movies#show', defaults: {id: 6}
(这两行显然是分开尝试的。)
错误
1:Couldn't find Movie with id=inception
2:app/controllers/movies_controller.rb:16:in
显示'
3:{"id"=>"inception"}
为什么inception
- 匹配网址的一部分被视为变量,即使我没有为:
添加前缀,又如何将硬编码的网址指向{{1} } -action与硬编码object#show
?
答案 0 :(得分:3)
看起来您对路线优先权问题:
并非所有路线都是平等创建的。路由的优先级由config / routes.rb文件中路由的出现顺序定义。优先级从上到下。该文件中的最后一个路由具有最低优先级,将在最后应用。如果没有路由匹配,则返回404。
所以,我想,你定义了
resources :movies
<强>前强>
get 'movies/inception' => "movies#show", :id => 6
get 'movies/inception' => 'movies#show', defaults: {id: 6}
你的路线没有被覆盖。
看看你的上一个问题。使用此路线表格,而不是您的:
get 'movies/inception/(:id)' => 'movies#show', defaults: {id: 6}
答案 1 :(得分:1)
我的猜测是你有像
这样的行 resources :movies
如果是这种情况,那么它正在创建movies /:id
的标准获取节目路线如果此行高于您的硬编码路线,那么它将优先。路径文件顶部的行优先于其下面的任何行
有些事情可以帮助您完成旅程。从命令行运行
rake routes
这将吐出所有可用的路线
如果您希望这样做,您可能需要考虑以下事项: 查看friendly_id gem “它允许你创建漂亮的URL并使用人性友好的字符串,就像它们是ActiveRecord模型的数字ID一样。”例如/ movies / inception