ruby-on-rails 3路由的范围和命名空间之间的区别

我不明白在ruby-on-rails 3的路由中命名空间和范围之间有什么区别。

有人可以解释吗?

namespace "admin" do resources :posts, :comments end scope :module => "admin" do resources :posts, :comments end 

区别在于生成的path。

path是命名空间的admin_posts_pathadmin_comments_path ,而它们只是posts_pathcomments_path

您可以通过将:name_prefix选项传递给作用域来获得与命名空间相同的结果。

例子总是帮助我,所以这里是一个例子:

 namespace :blog do resources :contexts end 

会给我们以下路线:

  blog_contexts GET /blog/contexts(.:format) {:action=>"index", :controller=>"blog/contexts"} POST /blog/contexts(.:format) {:action=>"create", :controller=>"blog/contexts"} new_blog_context GET /blog/contexts/new(.:format) {:action=>"new", :controller=>"blog/contexts"} edit_blog_context GET /blog/contexts/:id/edit(.:format) {:action=>"edit", :controller=>"blog/contexts"} blog_context GET /blog/contexts/:id(.:format) {:action=>"show", :controller=>"blog/contexts"} PUT /blog/contexts/:id(.:format) {:action=>"update", :controller=>"blog/contexts"} DELETE /blog/contexts/:id(.:format) {:action=>"destroy", :controller=>"blog/contexts"} 

使用范围…

 scope :module => 'blog' do resources :contexts end 

会给我们:

  contexts GET /contexts(.:format) {:action=>"index", :controller=>"blog/contexts"} POST /contexts(.:format) {:action=>"create", :controller=>"blog/contexts"} new_context GET /contexts/new(.:format) {:action=>"new", :controller=>"blog/contexts"} edit_context GET /contexts/:id/edit(.:format) {:action=>"edit", :controller=>"blog/contexts"} context GET /contexts/:id(.:format) {:action=>"show", :controller=>"blog/contexts"} PUT /contexts/:id(.:format) {:action=>"update", :controller=>"blog/contexts"} DELETE /contexts/:id(.:format) {:action=>"destroy", :controller=>"blog/contexts"} 

这里有一些很好的阅读主题: http : //edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing

从导轨上

“命名空间范围将自动添加:as以及:module:path前缀”。

所以

 namespace "admin" do resources :contexts end 

是相同的

 scope "/admin", as: "admin", module: "admin" do resources :contexts end 

范围命名空间都是将一组路由作用于给定的默认选项。
除了范围没有默认选项,并且对于命名空间 :path:as:module:shallow_path:shallow_prefix选项,全部默认为名称空间的名称。

范围命名空间的 可用选项对应于匹配的选项