differenza tra ambito e spazio dei nomi del routing ruby-on-rails 3


110

Non riesco a capire quale sia la differenza tra uno spazio dei nomi e uno scope nell'instradamento di ruby-on-rails 3.

Qualcuno potrebbe spiegare?

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

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

Risposte:


105

La differenza sta nei percorsi generati.

I percorsi sono admin_posts_pathe admin_comments_pathper lo spazio dei nomi, mentre sono giusti posts_pathe comments_pathper l'ambito.

È possibile ottenere lo stesso risultato di uno spazio dei nomi passando l' :name_prefixopzione all'ambito.


1
con percorsi intendi i nomi degli helper, giusto? non capisco la funzionalità dell'ambito. cosa fa (: module => "admin") se non cambia nulla?
never_had_a_name

2
Cambia i percorsi effettivi usati dai percorsi delle rotte in "/ admin / qualunque", proprio come lo spazio dei nomi. L'unica differenza è il prefisso aggiunto ai metodi di supporto.
alternativa

32
Per comprendere meglio la differenza: considera l'utilizzo di ambiti per la localizzazione tramite URL e spazi dei nomi per la nidificazione, ad esempio l'url: domain.com/nl/admin/panel . Nl è un ambito e admin è uno spazio dei nomi.
Valentin Vasilyev,

70

gli esempi mi aiutano sempre, quindi ecco un esempio:

namespace :blog do
  resources :contexts
end

ci fornirà i seguenti percorsi:

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

Utilizzo dell'ambito ...

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

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

Ecco qualche buona lettura sull'argomento: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing


1
Quindi, se non avessi utilizzato l'ambito qui e avessi semplicemente: resources: contexts, il controller non sarebbe nidificato su blog: blog /
contexts

55

dalla guida dei binari

"L'ambito dello spazio dei nomi aggiungerà automaticamente :ascosì come i prefissi :modulee :path."

così

namespace "admin" do
  resources :contexts
end

equivale a

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

2

Sia l' ambito che lo spazio dei nomi definiscono l'ambito di un insieme di percorsi per le opzioni predefinite fornite.
Solo che non ci sono opzioni di default per la portata , e per spazio dei nomi :path , :as, :module, :shallow_pathe :shallow_prefixtutte le opzioni di default per il nome dello spazio dei nomi.

Le opzioni disponibili sia per l' ambito che per lo spazio dei nomi corrispondono a quelle di match .


1

l'ambito è un po 'complesso, ma fornisce più opzioni per mettere a punto esattamente ciò che si desidera fare.

scope supporta tre opzioni: module, path e as . Se vedi l'ambito con tutte le sue opzioni, sarà esattamente lo stesso dello spazio dei nomi.

In altre parole, rotte generate da

namespace :admin do
  resources :posts
end

è uguale a

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

In altre parole, possiamo dire che non ci sono opzioni predefinite per l' ambito rispetto allo spazio dei nomi. lo spazio dei nomi aggiunge tutte queste opzioni per impostazione predefinita. Quindi, utilizzando l'ambito, possiamo ottimizzare le rotte come richiesto.

Se si esamina in profondità l' ambito e il comportamento predefinito dello spazio dei nomi , si noterà che l' ambito per impostazione predefinita supporta solo : l' opzione percorso , dove come spazio dei nomi supporta tre opzioni: modulo, percorso e come predefinito.

Per ulteriori informazioni, fare riferimento a un documento namespace-and-routing .


E se stai cercando di inserire, per qualsiasi motivo, un parametro richiesto, l'ambito è la soluzione migliore.
Fábio Araújo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.