这个"posts_path"变量是在哪里定义的?

4
我正在遵循这个看起来不错的Rails教程(链接)。在运行之后:
ruby script/generate scaffold Post

那么这个链接可以在其中一个erb文件中使用:

<%= link_to "My Blog", posts_path %>

为什么?我已经在整个应用程序中搜索了“posts_path”,但没有发现它的踪迹。另一方面,这个

<%= link_to "My Blog", home_path %>

这个不起作用,并且它也是一个控制器。

posts_path 定义在哪里了?

3个回答

14

posts_path是一个命名路由,您可以从由script/generate scaffold添加的路由中免费获得。请参阅routes.rb文件,您应该能看到类似于这样的内容:

map.resources :posts

请查看API文档,了解其它免费的命名路由。

另外,您可以运行rake routes来查看所有routes.rb提供的路由信息。

如果您想要一个名为home_path的路由,请在您的routes.rb中添加以下行:

map.home '/home', :controller => "home", :action => "index"

太棒了!正如你所知道的,它起作用了。我仍然想知道为什么我需要那么长的“home”行,而我只需要对帖子进行map.resources,但我想很快就会明白一切……或者在阅读API文档之后。再次感谢! - Dan Rosenstark
它更长是因为它偏离了RESTful路由约定。你可以这样做:map.resource :home注意非复数资源。这将为您提供一个名为home_path的路由,该路由指向该控制器,但您将被困在/home上。另一种方法是,您可以指定任何您想要的内容。 - Otto
很好。我认为你最后一行的修正应该是map.home '/home',:controller => "home",:action => "index"...否则Rails会使用HomeControllerController...再次感谢。 - Dan Rosenstark

1
我相信 "posts_path" 是由Rails在运行时动态创建的。看看你的routes.rb文件 - Home可能与Posts定义方式不同。这与你的控制器无关,它取决于路由定义。

1

map.root :controller => "home" 是编写到您主目录路径的缩写方式。这将使用 / 作为主目录,而不是 /home。如果仍想使用 /home(和 home_path),map.home 'home',:controller => "home" 将执行相同操作。

Mike Gunderloy 写了一份很棒的路由指南,其中涵盖了所有需要了解的内容。


很棒,教程已经涵盖了map.root,但是我仍然不理解map.home的长语法和map.root的短语法,但也许如果我阅读你建议的指南,我会明白的。感谢你的回答! - Dan Rosenstark
1
map.root 告诉你的应用程序在请求路由“/”(索引)时该做什么。另一方面,map.home 定义了一个新的路由 '/home',然后你必须指定路由名称(因为它使用 method_missing 生成它),然后是控制器。map.root 在这方面更好。 - Ryan Bigg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接