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
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
Respostas:
A diferença está nos caminhos gerados.
Os caminhos são admin_posts_path
e admin_comments_path
para o namespace, enquanto eles são apenas posts_path
ecomments_path
para o escopo.
Você pode obter o mesmo resultado que um namespace passando a :name_prefix
opção para o escopo.
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
"O escopo do namespace será adicionado automaticamente :as
, bem como prefixos :module
e :path
."
tão
namespace "admin" do
resources :contexts
end
é o mesmo que
scope "/admin", as: "admin", module: "admin" do
resources :contexts
end
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_path
e: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 .
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 .