ความแตกต่างระหว่างขอบเขตและเนมสเปซของการกำหนดเส้นทางทับทิมบนราง 3


110

ฉันไม่เข้าใจว่าความแตกต่างระหว่างเนมสเปซและขอบเขตในการกำหนดเส้นทางของทับทิมบนราง 3 คืออะไร

ใครช่วยอธิบายหน่อย

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

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

คำตอบ:


105

ความแตกต่างอยู่ในเส้นทางที่สร้างขึ้น

พา ธ คือadmin_posts_pathและadmin_comments_pathสำหรับเนมสเปซในขณะที่มันเป็นเพียงposts_pathและcomments_pathสำหรับขอบเขต

คุณสามารถรับผลลัพธ์เดียวกันกับเนมสเปซได้โดยส่ง:name_prefixตัวเลือกไปที่ขอบเขต


1
ตามเส้นทางคุณหมายถึงชื่อผู้ช่วยใช่ไหม ฉันไม่เข้าใจการทำงานของขอบเขต (: module => "admin") ทำอะไรถ้าไม่มีอะไรเปลี่ยนแปลง
never_had_a_name

2
มันเปลี่ยนเส้นทางจริงที่ใช้โดยเส้นทางเส้นทางเป็น "/ admin / อะไรก็ตาม" เช่นเดียวกับเนมสเปซ สิ่งเดียวที่แตกต่างกันคือคำนำหน้าที่เพิ่มเข้าไปในวิธีการช่วยเหลือ
ทางเลือก

32
เพื่อทำความเข้าใจความแตกต่าง: พิจารณาใช้ขอบเขตสำหรับการแปลผ่านทาง URL และ namespacing รังเช่น URL นี้: domain.com/nl/admin/panel nl เป็นขอบเขตและผู้ดูแลระบบคือเนมสเปซ
Valentin Vasilyev

70

ตัวอย่างช่วยฉันได้เสมอดังนั้นนี่คือตัวอย่าง:

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
ดังนั้นหากคุณไม่ได้ใช้ขอบเขตที่นี่และมีเพียง: ทรัพยากร: บริบทตัวควบคุมจะไม่ถูกซ้อนกันในบล็อก: บล็อก / บริบท
berto77


2

ทั้งขอบเขตและเนมสเปซกำหนดขอบเขตชุดของเส้นทางให้เป็นตัวเลือกเริ่มต้นที่กำหนด
ยกเว้นว่าจะไม่มีตัวเลือกเริ่มต้นสำหรับขอบเขตและสำหรับnamespace :path , :as, :module, :shallow_pathและ:shallow_prefixตัวเลือกเริ่มต้นทั้งหมดกับชื่อของ namespace ที่

ตัวเลือกที่ใช้ได้สำหรับทั้งขอบเขตและnamespaceสอดคล้องกับบรรดาของการแข่งขัน


1

ขอบเขตค่อนข้างซับซ้อน แต่มีตัวเลือกเพิ่มเติมในการปรับแต่งสิ่งที่คุณต้องการทำ

ขอบเขตสนับสนุนสามตัวเลือก: โมดูลเส้นทางและ หากคุณเห็นขอบเขตพร้อมตัวเลือกทั้งหมดมันจะเหมือนกับเนมสเปซทุกประการ

กล่าวอีกนัยหนึ่งคือเส้นทางที่สร้างโดย

namespace :admin do
  resources :posts
end

เหมือนกับ

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

กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่าไม่มีตัวเลือกเริ่มต้นสำหรับขอบเขตเมื่อเทียบกับเนมสเปซ เนมสเปซเพิ่มตัวเลือกเหล่านี้ทั้งหมดตามค่าเริ่มต้น ดังนั้นการใช้ขอบเขตทำให้เราสามารถปรับแต่งเส้นทางได้ตามต้องการ

หากคุณมองลึกลงไปในขอบเขตและลักษณะการทำงานเริ่มต้นของเนมสเปซคุณจะพบว่าขอบเขตนั้นโดยค่าเริ่มต้นรองรับเฉพาะ:ตัวเลือกเส้นทางโดยที่เนมสเปซรองรับโมดูลตัวเลือกสามตัวพา ธ และตามค่าเริ่มต้น

สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารnamespace และเส้นทาง


และหากคุณกำลังพยายามใส่พารามิเตอร์ที่จำเป็นไม่ว่าด้วยเหตุผลใดก็ตามขอบเขตคือทางออกที่ดีที่สุด
FábioAraújo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.