Ruby on Rails (API)

Jakkapong Luangpong
CSCMU Undergrad Seminar
3 min readApr 26, 2020

บทความนี้ เป็นบทความแนะนำการเขียน 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 โดยเราทำการจำลองดังนี้

  1. Author (นามปากกา, อายุ)
  2. 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
You’re on Rails

ตัวผู้เขียนขอสมมติว่าใน database มีข้อมูลที่จะใช้อยู่แลัว

เราจะทำการทดสอบการดึง API ขอข้อมูล โดยใช้ postman ดั้งนี้

ข้อมูล Author ทั้งหมด http://localhost:3000/authors/

index

ข้อมูล Book ของ Author คนนั้นๆ http://localhost:3000/authors/3/all_books

all_books

--

--