diferença entre escopo e namespace do roteamento ruby-on-rails 3

110

Não consigo entender qual é a diferença entre um namespace e um escopo no roteamento de ruby-on-rails 3.

Alguém poderia explicar?

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

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

Respostas:

105

A diferença está nos caminhos gerados.

Os caminhos são admin_posts_pathe admin_comments_pathpara o namespace, enquanto eles são apenas posts_pathecomments_path para o escopo.

Você pode obter o mesmo resultado que um namespace passando a :name_prefixopção para o escopo.

alternativo
fonte
1
por caminhos você quer dizer os nomes dos auxiliares, certo? não entendo a funcionalidade do osciloscópio. o que (: módulo => "admin") faz se nada muda?
never_had_a_name
2
Ele muda os caminhos reais usados ​​pelos caminhos de rota para "/ admin / qualquer", assim como o namespace. A única diferença é o prefixo adicionado aos métodos auxiliares.
alternativa
32
Para entender melhor a diferença: considere o uso de escopos para localização por URL e namespacing para aninhamento, por exemplo, o url: domain.com/nl/admin/panel . O nl é um escopo e admin é um namespace.
Valentin Vasilyev
70

exemplos sempre me ajudam, então aqui está um exemplo:

namespace :blog do
  resources :contexts
end

nos dará as seguintes rotas:

    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"}

Usando escopo ...

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

Nos dará:

     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"}

Aqui estão algumas boas leituras sobre o assunto: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing

ynkr
fonte
1
Então, se você não usou o escopo aqui e apenas teve: resources: contexts, o controlador não estaria aninhado no blog: blog / contexts
berto77
55

do guia dos trilhos

"O escopo do namespace será adicionado automaticamente :as, bem como prefixos :modulee :path."

tão

namespace "admin" do
  resources :contexts
end

é o mesmo que

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

Tanto o escopo quanto o namespace estão definindo um conjunto de rotas para as opções padrão fornecidas.
Só que não há opções padrão para escopo , e por namespace :path , :as, :module, :shallow_pathe:shallow_prefix todas as opções padrão para o nome do namespace.

As opções disponíveis para o escopo e o namespace correspondem àquelas de correspondência .

lagos são
fonte
1

o escopo é um pouco complexo, mas oferece mais opções para ajustar exatamente o que você deseja fazer.

O escopo oferece suporte a três opções: módulo, caminho e como . Se você vir o escopo com todas as opções, será exatamente o mesmo que o namespace.

Em outras palavras, as rotas geradas por

namespace :admin do
  resources :posts
end

é o mesmo que

scope module: 'admin', path: 'admin', as: 'admin' do
  resources :posts
end

Em outras palavras, podemos dizer que não há opções padrão para o escopo em comparação com o namespace. namespace adiciona todas essas opções por padrão. Assim, usando o escopo, podemos ajustar mais as rotas conforme necessário.

Se você der uma olhada aprofundada no escopo e no comportamento padrão do namespace , descobrirá que o escopo, por padrão, suporta apenas : opção de caminho , onde o namespace oferece suporte a três opções de módulo, caminho e como padrão.

Para obter mais informações, consulte um doc namespace-and-routing .

VK Singh
fonte
E se você está tentando colocar, por algum motivo, um parâmetro obrigatório, o escopo é a melhor solução.
Fábio Araújo