Rails路由:将硬编码路径作为参数处理?

时间:2014-03-11 01:41:28

标签: ruby-on-rails

我是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

2 个答案:

答案 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