路由如何知道这么多?

时间:2012-09-12 23:38:21

标签: ruby-on-rails routing

我在轨道tutorial上关注路线的整齐红宝石。所以我想知道,路由如何知道这么多?

我有一个名为posts_controller的控制器和一个帖子模型。在routes.rb文件中,我添加了

# config/routes.rb
resources :posts

据我了解,这会自动为与帖子关联的所有控制器操作创建适当的路由。到目前为止,我的posts_controller中只有一个方法:

# app/controllers/posts_controller.rb
def index

end

但奇怪的是,当我执行

$ rake routes

它给了我所有这些:

    posts GET    /posts(.:format)          posts#index
          POST   /posts(.:format)          posts#create
 new_post GET    /posts/new(.:format)      posts#new
edit_post GET    /posts/:id/edit(.:format) posts#edit
     post GET    /posts/:id(.:format)      posts#show
          PUT    /posts/:id(.:format)      posts#update
          DELETE /posts/:id(.:format)      posts#destroy

路由机制如何知道这么多而没有告诉我我想要创建和更新帖子?

2 个答案:

答案 0 :(得分:3)

使用"资源"与您定义的操作无关。它只是创建控制器中可能需要的所有其他路径。

如您所见,它创建:索引,创建,新建,编辑,显示,更新和销毁

它实际上并不是智能的,因为它为不存在的行为创造了路径。

如何将其限制为仅需要的操作的示例。

resources :posts, :only => [:show, :index]

答案 1 :(得分:2)

来自Ruby on Rails guide, Resource Routing: the Rails Default

  

资源路由允许您快速声明给定资源控制器的所有常用路由。而不是为索引,显示,新建,编辑,创建,更新和销毁操作声明单独的路由,而是一条资源丰富的路由在一行代码中声明它们。

这是轻松快速定义路线的Rails方式。它不会检查控制器中的方法。

您对其工作原理的理解是正确的。话虽如此,如果您不想要所有路线,只想拥有索引,创建和更新,您可以选择这样做:

resources :posts, :only => [:index, :create, :update]