ruby-on-rails 3路由的作用域和名称空间之间的区别


109

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

有人可以解释一下吗?

namespace "admin" do
  resources :posts, :comments
end

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

Answers:


105

区别在于生成的路径。

路径是admin_posts_pathadmin_comments_path命名空间的路径,而它们是posts_pathcomments_path为范围。

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


1
通过路径,您的意思是助手的名字对吗?我不了解示波器的功能。如果什么都没改变,它怎么办(:module =>“ admin”)?
never_had_a_name 2010年

2
就像命名空间一样,它将路由路径使用的实际路径更改为“ / admin / whatever”。唯一的不同是添加到辅助方法的前缀。
备用

32
为了更好地理解它们之间的区别,请考虑使用范围通过URL进行本地化,并使用命名空间进行嵌套,例如url:domain.com/nl/admin/panel。nl是作用域,而admin是名称空间。
Valentin Vasilyev

69

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

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


1
因此,如果您在这里不使用范围,而只拥有:resources:contexts,则该控制器将不会嵌套在blog:blog / contexts
berto77 2013年

55

导轨

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

所以

namespace "admin" do
  resources :contexts
end

是相同的

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

2

无论范围命名空间是观察一组路线到指定默认选项。
不同之处在于有没有为默认选项范围,以及命名空间 :path:as:module:shallow_path:shallow_prefix选择所有默认的命名空间的名称。

作用域名称空间的可用选项都与match的选项相对应。


1

范围有点复杂,但是提供了更多选项来精确调整您要执行的操作。

范围支持三个选项:模块,路径和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


而且,如果出于任何原因试图放置必需的参数,则范围是最佳解决方案。
法比奥(FábioAraújo)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.