Ruby on Rails (API)
บทความนี้ เป็นบทความแนะนำการเขียน Ruby on Rails แบบ API เบื้องต้น เพื่อไม่ให้เสียเวลาเรามาเริ่มกันเถอะ
การติดตั้ง
สำหรับหลายๆ คนที่ใช้ Windows OS ขอแนะนำให้ใช้ Windows Subsystem for Linux (WSL) ในการรัน Rails โดยเริ่มต้นเราต้องทำการติดตั้ง Rails ผ่าน WSL สามารถทำตามได้ทางลิงค์นี้
เมื่อติดตั้งเสร็จแล้ว เราลอง check version ของ Rails โดยพิมพ์คำสั่ง
rails -v
เริ่มสร้าง Project
เรามาเริ่มสร้าง Project แรกกันเลย โดยพิมพ์คำสั่งต่อไปนี้
rails new Seminar --api --database=postgresql
โดยชื่อ Project คือ Seminar และในที่นี้ผมขอใช้ database เป็น PostgreSQL (ถ้าไม่ระบุตรงนี้จะเป็นการใช้ SQLite) เมื่อรันคำสั่งเสร็จ Rails จะสร้างโฟลเดอร์ Seminar ขึ้นมา
จากนั้นเราต้องทำการ config ส่วน development ใน database.yml โดยเข้าได้ทาง config>database.yml ทำการกรอก username และ password ของ user PostgreSQL (ชื่อ user ต้องตรงกับชื่อ Project ของเรา)
เมื่อทำการกรอก username และ password เสร็จ รันคำสั่งต่อไปนี้เพื่อสร้าง database ขึ้นมา
rails db:create
เมื่อทำการ config เสร็จ ต่อไปเรามาเริ่มสร้าง model โดยเราทำการจำลองดังนี้
- Author (นามปากกา, อายุ)
- Book (ชื่อหนังสือ, ราคา)
ทั้ง 2 model มีความสัมพันธ์แบบ One-to-many คือ “ คนแต่งหนึ่งคนแต่งหนังสือได้หลายเล่มและหนังสือแต่ละเล่มมีคนแต่ได้เพียงหนึ่งคน” เมื่อกำหนดความสัมพันธ์ได้เรามาเริ่มสร้าง model กันเลย
สร้าง Model
ในการสร้าง model ขอแนะนำคำสั่ง scaffold เป็นคำสั่งในการสร้างทั้ง model, controller, migrate file (ยกเว้น view เพราะทำแบบ API) ซึ่งมีความสะดวกง่าย แถมในตัว controller มี function พื้นฐานเขียนมาให้ด้วย โดยพิมพ์คำสั่งต่อไปนี้
rails g scaffold Author pen_name:text age:integer
เมื่อสร้างเสร็จ เรามาดูที่ตัว controller จะเห็น function ที่ Rails สร้างขึ้นไว้ให้แล้วมีดังนี้
class AuthorsController < ApplicationController
#before_action เมื่อเรียกใช้คำสั่ง show, update, destroy จะรันคำสั่ง set_author ก่อนเป็นอันดับแรก จากนั้นจะรันคำสั่งนั้นๆ ตามมา before_action :set_author, only: [:show, :update, :destroy] # GET /authors #แสดง Author ทั้งหมดทุกคน เป็น JSON def index @authors = Author.all render json: @authors end # GET /authors/1 #แสดง Author แบบรายบุคคล เป็น JSON def show render json: @author end # POST /authors #รับข้อมูล Author แบบ JSON และบันทึกลง database def create @author = Author.new(author_params) if @author.save render json: @author, status: :created, location: @author else render json: @author.errors, status: :unprocessable_entity end
end # PATCH/PUT /authors/1 #รับข้อมูล Author แบบ JSON และอัพเดทใหม่ def update if @author.update(author_params) render json: @author else render json: @author.errors, status: :unprocessable_entity end end # DELETE /authors/1 #ลบข้อมูล Author def destroy @author.destroy end
private
# Use callbacks to share common setup or constraints between actions. #ค้นหา Author จาก id params จะทำงานก็ต่อเมื่อ เรียกใช้ show, update, destroy def set_author @author = Author.find(params[:id]) end
# Only allow a trusted parameter "white list" through. # ทำการกรองข้อมูล params ในรูปแบบ model Author ที่มี pen_name, age ข้อมูล params อื่นๆ ที่ไม่ใช่ตัดทิ้ง def author_params params.require(:author).permit(:pen_name, :age) endend
จะเห็นได้ว่า Rails จัดการสร้าง function พื้นฐาน show, create, update, delete และเราสามารถเขียน function เองเพิ่มเติมได้อีกด้วย
ต่อไป เรามาสร้าง model Book โดยใช้คำสั่งเดิมดังนี้
rails g scaffold Book name:text price:integer author:references
จากคำสั่งข้างต้น มีการเพิ่ม reference จาก Author เพื่อทำการเชื่อมความสัมพันธ์แบบ One-to-many
เมื่อ model ทั้ง 2 ตัวเสร็จ เราต้องทำ migrate model เพื่อสร้างเป็น table ใน database โดยใช้คำสั่ง
rails db:migrate
ถึงจุดนี้ เราทำการเพิ่ม function ลงใน controller ของ Author เพื่อทำการ show ข้อมูลของหนังสือที่ Author คนนั้นๆเป็นคนแต่ง โดยเพิ่ม code ดังนี้
# GET /author/:id/all_books
def all_books
@all_book = Author.find(params[:id])
render json: { author: @all_book.pen_name, book: @all_book.book}
end
@all_book.book จะเป็นการเอาข้อมูล Book ทั้งหมดของ Author คนนั้นๆ นี่เป็นอีกหนึ่งความสะดวกของ Rails ไม่ต้อง join ตาราง Author กับ book เพียงแค่ใช้ “.”
เนื่องจาก function all_book เราได้ทำเพิ่มเติมขึ้นมาเอง เราจึงต้องไปเพิ่มเส้นทาง route ของ Rails เพื่อให้ map กับ URL ถูกต้องและสามารถดึงข้อมูลได้ โดยเพิ่ม code ใน config > routes.erb ดังนี้
resources :authors do member do get "all_books" end end
Run Rails
เมื่อถึงจุดนี้ เราจะทำการรัน Rails ครั้งแรกโดยพิมพ์คำสั่ง
rails start
ตัวผู้เขียนขอสมมติว่าใน database มีข้อมูลที่จะใช้อยู่แลัว
เราจะทำการทดสอบการดึง API ขอข้อมูล โดยใช้ postman ดั้งนี้
ข้อมูล Author ทั้งหมด http://localhost:3000/authors/
ข้อมูล Book ของ Author คนนั้นๆ http://localhost:3000/authors/3/all_books