ฉันไม่เข้าใจว่าความแตกต่างระหว่างเนมสเปซและขอบเขตในการกำหนดเส้นทางของทับทิมบนราง 3 คืออะไร
ใครช่วยอธิบายหน่อย
namespace "admin" do
resources :posts, :comments
end
scope :module => "admin" do
resources :posts, :comments
end
ฉันไม่เข้าใจว่าความแตกต่างระหว่างเนมสเปซและขอบเขตในการกำหนดเส้นทางของทับทิมบนราง 3 คืออะไร
ใครช่วยอธิบายหน่อย
namespace "admin" do
resources :posts, :comments
end
scope :module => "admin" do
resources :posts, :comments
end
คำตอบ:
ความแตกต่างอยู่ในเส้นทางที่สร้างขึ้น
พา ธ คือadmin_posts_path
และadmin_comments_path
สำหรับเนมสเปซในขณะที่มันเป็นเพียงposts_path
และcomments_path
สำหรับขอบเขต
คุณสามารถรับผลลัพธ์เดียวกันกับเนมสเปซได้โดยส่ง:name_prefix
ตัวเลือกไปที่ขอบเขต
ตัวอย่างช่วยฉันได้เสมอดังนั้นนี่คือตัวอย่าง:
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
จากคู่มือราง
"ขอบเขต namespace จะเพิ่มโดยอัตโนมัติ:as
เช่นเดียวกับ:module
และ:path
คำนำหน้า."
ดังนั้น
namespace "admin" do
resources :contexts
end
เหมือนกับ
scope "/admin", as: "admin", module: "admin" do
resources :contexts
end
ทั้งขอบเขตและเนมสเปซกำหนดขอบเขตชุดของเส้นทางให้เป็นตัวเลือกเริ่มต้นที่กำหนด
ยกเว้นว่าจะไม่มีตัวเลือกเริ่มต้นสำหรับขอบเขตและสำหรับnamespace
:path
, :as
, :module
, :shallow_path
และ:shallow_prefix
ตัวเลือกเริ่มต้นทั้งหมดกับชื่อของ namespace ที่
ตัวเลือกที่ใช้ได้สำหรับทั้งขอบเขตและnamespaceสอดคล้องกับบรรดาของการแข่งขัน
ขอบเขตค่อนข้างซับซ้อน แต่มีตัวเลือกเพิ่มเติมในการปรับแต่งสิ่งที่คุณต้องการทำ
ขอบเขตสนับสนุนสามตัวเลือก: โมดูลเส้นทางและ หากคุณเห็นขอบเขตพร้อมตัวเลือกทั้งหมดมันจะเหมือนกับเนมสเปซทุกประการ
กล่าวอีกนัยหนึ่งคือเส้นทางที่สร้างโดย
namespace :admin do
resources :posts
end
เหมือนกับ
scope module: 'admin', path: 'admin', as: 'admin' do
resources :posts
end
กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่าไม่มีตัวเลือกเริ่มต้นสำหรับขอบเขตเมื่อเทียบกับเนมสเปซ เนมสเปซเพิ่มตัวเลือกเหล่านี้ทั้งหมดตามค่าเริ่มต้น ดังนั้นการใช้ขอบเขตทำให้เราสามารถปรับแต่งเส้นทางได้ตามต้องการ
หากคุณมองลึกลงไปในขอบเขตและลักษณะการทำงานเริ่มต้นของเนมสเปซคุณจะพบว่าขอบเขตนั้นโดยค่าเริ่มต้นรองรับเฉพาะ:ตัวเลือกเส้นทางโดยที่เนมสเปซรองรับโมดูลตัวเลือกสามตัวพา ธ และตามค่าเริ่มต้น
สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารnamespace และเส้นทาง