我不明白在ruby-on-rails 3的路由中,名称空间和范围之间的区别是什么。
有人可以解释一下吗?
namespace "admin" do
resources :posts, :comments
end
scope :module => "admin" do
resources :posts, :comments
end
我不明白在ruby-on-rails 3的路由中,名称空间和范围之间的区别是什么。
有人可以解释一下吗?
namespace "admin" do
resources :posts, :comments
end
scope :module => "admin" do
resources :posts, :comments
end
Answers:
区别在于生成的路径。
路径是admin_posts_path
和admin_comments_path
命名空间的路径,而它们是posts_path
和comments_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。如果您看到具有所有it选项的范围,它将与名称空间完全相同。
换句话说,由
namespace :admin do
resources :posts
end
与...相同
scope module: 'admin', path: 'admin', as: 'admin' do
resources :posts
end
换句话说,我们可以说与名称空间相比,没有默认的范围选项。命名空间默认情况下添加所有这些选项。因此,使用范围,我们可以根据需要更精细地调整路线。
如果深入研究范围和名称空间的默认行为,您会发现范围默认情况下仅支持:path选项,其中as 名称空间支持模块,path和as三个选项。
有关更多信息,请参考doc namespace-and-routing。