รูปแบบเดิมของคำตอบนี้จะแตกต่างกันอย่างดุเดือดและสามารถพบได้ที่นี่ เพียงพิสูจน์ว่ามีมากกว่าหนึ่งวิธีในการดูแลแมว
ฉันได้อัปเดตคำตอบตั้งแต่การใช้เนมสเปซและใช้การเปลี่ยนเส้นทาง 301 - แทนที่จะเป็น 302 เริ่มต้นขอบคุณ pixeltrix และ Bo Jeanes สำหรับการแจ้งเตือนสิ่งเหล่านั้น
คุณอาจต้องการที่จะสวมใส่จริงๆหมวกกันน็อกที่แข็งแกร่งเพราะนี้จะพัดใจของคุณ
API การกำหนดเส้นทาง Rails 3 นั้นยอดเยี่ยมมาก หากต้องการเขียนเส้นทางสำหรับ API ของคุณตามที่คุณต้องการคุณต้องมีสิ่งนี้:
namespace :api do
namespace :v1 do
resources :users
end
namespace :v2 do
resources :users
end
match 'v:api/*path', :to => redirect("/api/v2/%{path}")
match '*path', :to => redirect("/api/v2/%{path}")
end
หากความคิดของคุณยังคงไม่เปลี่ยนแปลงหลังจากจุดนี้ให้ฉันอธิบาย
ก่อนอื่นเราเรียกnamespace
ว่ามีประโยชน์มากเมื่อคุณต้องการกำหนดเส้นทางจำนวนมากไปยังเส้นทางและโมดูลเฉพาะที่มีชื่อคล้ายกัน ในกรณีนี้เราต้องการทุกเส้นทางภายในบล็อกสำหรับเราnamespace
ที่จะกำหนดขอบเขตการควบคุมภายในโมดูลและการร้องขอทุกเส้นทางภายในเส้นทางนี้จะนำหน้าด้วยApi
api
คำขอเช่น/api/v2/users
คุณรู้หรือไม่?
ภายในเนมสเปซเราจะกำหนดเนมสเปซสองรายการเพิ่มเติม (woah!) เวลานี้เรากำลังกำหนด "v1" namespace ดังนั้นทุกเส้นทางสำหรับตัวควบคุมที่นี่จะเป็นภายในV1
โมดูลภายในโมดูล:Api
Api::V1
โดยกำหนดภายในเส้นทางนี้การควบคุมจะตั้งอยู่ที่resources :users
Api::V1::UsersController
นี้เป็นรุ่นที่ 1 /api/v1/users
และคุณได้รับโดยมีการส่งคำขอเช่น
รุ่นที่ 2 เป็นเพียงเล็ก ๆที่แตกต่างกันเล็กน้อย แทนการควบคุมที่ให้บริการก็เป็นที่ก็ตอนนี้ที่Api::V1::UsersController
คุณจะได้รับโดยมีการส่งคำขอเช่นApi::V2::UsersController
/api/v2/users
ถัดไปmatch
ใช้ นี้จะตรงกับเส้นทาง API /api/v3/users
ทั้งหมดที่ไปที่สิ่งที่ต้องการ
นี่คือส่วนที่ฉันต้องค้นหา :to =>
ตัวเลือกที่ช่วยให้คุณสามารถระบุได้ว่าคำขอเฉพาะควรจะเปลี่ยนเส้นทางไปที่อื่น - ฉันรู้ว่ามาก - แต่ผมไม่ทราบวิธีการที่จะได้รับมันจะเปลี่ยนเส้นทางไปที่อื่นและผ่านในส่วนของการร้องขอเดิมพร้อมกับมัน .
ในการทำเช่นนี้เราเรียกใช้redirect
เมธอดและส่งผ่านสตริงด้วย%{path}
พารามิเตอร์พิเศษ เมื่อคำขอมาตรงกับรอบสุดท้ายนี้match
จะทำการแทรกpath
พารามิเตอร์เข้าไปในตำแหน่ง%{path}
ภายในสตริงและเปลี่ยนเส้นทางผู้ใช้ไปยังตำแหน่งที่ต้องการ
สุดท้ายเราใช้อีกmatch
เส้นทางเส้นทางที่เหลือทั้งหมดนำหน้าด้วยและเปลี่ยนเส้นทางไปยัง/api
/api/v2/%{path}
ที่นี้หมายถึงการร้องขอเช่นจะไป/api/users
/api/v2/users
ฉันไม่สามารถคิดออกว่าจะได้รับ/api/asdf/users
เพื่อให้ตรงเพราะวิธีการที่คุณจะกำหนดว่าควรจะร้องขอไปยัง/api/<resource>/<identifier>
หรือ/api/<version>/<resource>
?
อย่างไรก็ตามมันสนุกกับการค้นคว้าและฉันหวังว่ามันจะช่วยคุณได้!