(หมายเหตุ: นี่เป็นเพียงบันทึกย่อที่ฉันเผยแพร่เพื่อตัวเองเป็นหลัก หากใครก็ตามที่สะดุดกับสิ่งเหล่านี้และพบว่ามีประโยชน์ก็เยี่ยมมาก นี่ถือว่าคุณรู้วิธีการสร้างแบบจำลอง สร้างการย้ายข้อมูล และทำงานกับ Ruby, Rake และ Active บันทึก)

การสร้างแบ็กเอนด์และการดึงข้อมูลคำขอไม่ได้แย่อย่างที่ฉันคิดไว้ว่าจะเกิดขึ้นในซินาตร้า มาทำความคุ้นเคยกับการสร้างฟังก์ชันคำขอดึงข้อมูลพื้นฐานลงในเซิร์ฟเวอร์ส่วนหลังกันดีกว่า

สมมติว่าเรากำลังจะสร้างแบ็กเอนด์สำหรับแอปพลิเคชันเพื่อลงทะเบียนเทรนเนอร์โปเกมอน เราจะต้องเรียนรู้ที่จะสร้างตารางและการเชื่อมโยงแบบหนึ่งต่อหลายตัวกับโปเกมอนที่พวกมันมี (ฉันจะเพิ่มทั้งสองอย่างในภายหลัง) จากนั้นเราจำเป็นต้องเพิ่มผู้ฝึกสอนลงในฐานข้อมูล และสุดท้ายส่งข้อมูลไปยังส่วนหน้าของแอปพลิเคชันผ่านการร้องขอการดึงข้อมูล (พร้อมทั้งแก้ไขและลบแน่นอน)

รับคำขอ

คำขอรับอาจเป็นคำขอที่ใช้มากที่สุดในการ "รับ" ข้อมูลจากฐานข้อมูล ดังนั้นเราจะเพิ่มคำขอนั้นก่อนในไฟล์ application_controller.rb

#application_controller.rb
class ApplicationController::Sinatra
  get "/trainers" do
    trainer = Trainer.all
    trainer.to_json
  end
end

ในสถานการณ์นี้ เมื่อคุณไปที่ “URL/trainer” ลูกค้าที่นี่จะพูดว่าในบรรทัดแรก

“ฉันต้องการให้คุณขอข้อมูลสำหรับผู้ฝึกสอนให้ฉัน”

จากนั้น Ruby จะนำโมเดลเทรนเนอร์และค้นหาเทรนเนอร์ทั้งหมดแล้วส่งคืนให้กับลูกค้า (ซึ่งเรากำหนดให้กับตัวแปร "เทรนเนอร์") จากนั้นเราจะนำข้อมูลทั้งหมดไปใช้ .to_json สิ่งนี้จะเปลี่ยนข้อมูลดิบให้เป็นไฟล์ json เพื่อให้ไคลเอนต์ใช้

นี่เป็นรูปแบบที่ง่ายที่สุดในการดึงข้อมูลจากเซิร์ฟเวอร์ มีเทคนิคอื่นๆ ในการดึงข้อมูล (เช่น การเรียงลำดับผลลัพธ์ตามตัวอักษร การจำกัดจำนวนผลลัพธ์ และอื่นๆ) แต่สามารถพูดคุยได้ในหัวข้ออื่น

คำขอโพสต์

แอปนี้คงจะไร้ประโยชน์หากเราไม่สามารถสร้างข้อมูลใหม่และบันทึกลงในฐานข้อมูลได้ เรามาสร้างคำขอ POST กันต่อไป

สิ่งแรกที่เราจะใช้คืออัญมณีที่มาจากชั้นวาง การดำเนินการนี้จะช่วยให้เรารับคำขอ POST ที่ส่งจากไคลเอ็นต์และใช้ "params" เพื่อสร้างแฮช Ruby สำหรับ ActiveRecord เพื่อบันทึกลงในฐานข้อมูลเทรนเนอร์ รวม rack-contrib ไว้ใน Gemfile.rb ของคุณหรือรัน “gem install rack-contrib”

#Gemfile.rb 
gem "rack-contrib", "~> 2.3"

จากนั้นรวมสิ่งนี้ไว้ใน config.ru ของคุณเพื่อให้ Rack เพื่อแยกวิเคราะห์ข้อมูล JSON

#config.ru 
use Rack::JSONBodyParser

ตอนนี้เราสามารถเพิ่มคำขอ POST ลงในไฟล์ application_controller.rb ได้

#application_controller.rb
post "/trainers" do
  new_trainer = Trainer.create(
    first_name: params[:first_name],
    last_name: params[:last_name],
    age: params[:age],
    hometown: [:hometown],
    starting_pokemon: [:starting_pokemon],
    bio: [:bio]
  )
  new_trainer.to.json
end

สิ่งที่ลูกค้าพูดในบรรทัดแรกคือ “ฉันต้องการ โพสต์ (หรือเพิ่ม) บางอย่างลงในฐานข้อมูล ผู้ฝึกสอน” ในกรณีนี้ เรากำลัง สร้างเทรนเนอร์ที่มีชื่อ นามสกุล อายุ บ้านเกิด โปเกมอนเริ่มต้น และประวัติโดยย่อ เราไม่จำเป็นต้องเพิ่ม ID ที่นี่ เนื่องจากจะถูกกำหนดโดยอัตโนมัติเมื่อบันทึกลงในฐานข้อมูล และเราไม่ต้องการคอลเลกชันโปเกมอนของผู้ฝึกสอน เนื่องจากเราสามารถทำได้ผ่านการเชื่อมโยงตาราง

ตอนนี้เราใช้วิธี #create เพื่อสร้างอินสแตนซ์ใหม่ จากนั้นบันทึกลงในฐานข้อมูลในครั้งเดียว แน่นอนคุณสามารถใช้ .new เพื่อสร้างอินสแตนซ์ จากนั้นใช้เมธอด #save เพื่อบันทึกลงในฐานข้อมูลแยกกัน คุณสามารถเพิ่มฟังก์ชันเพิ่มเติมหรือการตรวจสอบความถูกต้องในระหว่างนั้นได้ แต่เพื่อจุดประสงค์นี้ #create จะง่ายและรวดเร็ว

ลบคำขอ

คำขอ DELETE สามารถจัดการได้โดยการกำหนดเป้าหมาย ID ของผู้ฝึกสอน สมมติว่า URL ของผู้ฝึกสอนที่มีรหัส 5 จะเป็น “/trainer/5 และคำขอจะมีลักษณะดังนี้:

#application_controller.rb
delete "trainer/:id" do
  trainer = Trainer.all.find(params[:id])
  trainer.destroy
  trainer.to_json
)

สิ่งที่ลูกค้าพูดที่นี่คือ “ฉันต้องการให้คุณ ลบ ผู้ฝึกสอน ที่มีรหัส :id” (ซึ่งในตัวอย่างของเราคือ 5).จากนั้น Ruby จะตรวจดูเทรนเนอร์ ทั้งหมด เพื่อ ค้นหาเทรนเนอร์ที่มี id เป็น 5 (พารามิเตอร์ [:id] คือ รับ :id ของ the เป็นแฮชและแยกค่า ซึ่งในกรณีนี้คือ 5) จากนั้นใช้วิธีการทำลายเพื่อลบผู้ฝึกสอนการกำหนดเป้าหมายนั้นออกจากฐานข้อมูล

คำขอแพทช์

คำขอแพตช์นั้นคล้ายกับคำขอ DELETE โดยที่เรากำหนดเป้าหมายผู้ฝึกสอนโดยใช้พารามิเตอร์และ ID:

#application_controller.rb
patch "trainer/:id" do
  trainer = Trainer.all.find(params[:id])
  trainer.update(bio: params[:bio])
end

ในสถานการณ์นี้ การอัปเดตเฉพาะนี้ เราต้องการเปลี่ยนประวัติของผู้ฝึกสอนที่ระบุ ลูกค้ากำลังพูดว่า “ฉันต้องการให้คุณเปลี่ยน (แพทช์) เทรนเนอร์ ด้วยรหัส :id” (อีกครั้งในของเรา กรณีมันจะเป็น id ของ 5) Ruby ค้นหาฐานข้อมูลเทรนเนอร์สำหรับเทรนเนอร์ด้วยรหัส 5 และใช้วิธีการอัปเดตซึ่งกำหนดเป้าหมายไปที่คีย์ "ชีวภาพ" ของผู้ฝึกสอน เมื่อใช้พารามิเตอร์ร่วมกับ :bio ค่าใหม่ที่ส่งจากไคลเอ็นต์จะไม่อัปเดตบนเครื่องฝึกที่ระบุ

ที่เสร็จเรียบร้อย! ขอย้ำอีกครั้งว่าสิ่งเหล่านี้เป็นพื้นฐานในการสร้างคำขอดึงข้อมูลพื้นฐานไปยังเซิร์ฟเวอร์