Rails路由中的资源与命名空间

时间:2015-12-04 02:51:17

标签: ruby-on-rails ruby routes

resourcesnamespace之间有什么区别?

我在Rack内有gem个应用,我想通过Rails应用调用。

namespace :app do
  get 'go', to: Gem::Controller.new
end

由于我有一个名为AppController的控制器,我可以使用这个吗?

resources :app do
  collection do
    get 'go', to: Gem::Controller.new
  end
end

哪种方式更好?

2 个答案:

答案 0 :(得分:2)

根据Rails guide routing section

资源:

  

资源路由允许您快速声明所有常见的   给定资源控制器的路由。而不是宣布   索引,显示,新建,编辑,创建,更新和的单独路线   摧毁行动,一条足智多谋的路线在一行中宣告它们   代码。

命名空间:

  

您可能希望在命名空间下组织控制器组。最   通常,您可以将许多管理控制器分组   Admin ::名称空间。你可以把这些控制器放在   app / controllers / admin目录,你可以将它们组合在一起   你的路由器。

例如:

namespace :admin do
  resources :articles, :comments
end

但是,我认为你的意思是在收集和命名空间之间做出选择。

就像这样,如果您计划为该应用程序提供更多路由,则命名空间将是更好的选择。否则,您可以将其用作集合。

答案 1 :(得分:1)

resources是生成REST界面所需的七条路线的快捷方式。

所以resources :app会产生以下七条路线(补丁和路线相同):

get    "apps"          => "apps#index",   :as => 'apps'
get    "apps/:id"      => "apps#show",    :as => 'app'
get    "apps/new"      => "apps#new",     :as => 'new_app'
post   "apps"          => "apps#create",  :as => 'apps'
get    "apps/:id/edit" => "apps#edit",    :as => 'edit_app'
patch  "apps/:id"      => "apps#update",  :as => 'app'
put    "apps/:id"      => "apps#update",  :as => 'app'
delete "apps/:id"      => "apps#destroy", :as => 'app'

然后由于get 'go', to: Gem::Controller.new而生成另一条路线:

/apps/go

如果是命名空间,则不会创建apps七条REST路由,但会生成apps/go的命名路由。