TODO với React + Rails Part 4: Xây dựng CRUD API
Bài đăng này đã không được cập nhật trong 5 năm
Trong bài trước mình đang giới thiệu về cách xây dựng base api rồi. Bạn có thể xem ở đây https://viblo.asia/p/todo-voi-react-rails-part-3-xay-dung-base-api-aWj53NVYl6m . Bài tiếp theo ở đây sẽ bắt đầu với API cơ bản: API CRDUD task To Do.
Routes
# config/routes.rb
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
resources :tasks
end
end
end
API List tasks
# app/controllers/api/v1/tasks_controller.rb
class Api::V1::TasksController < ApiController
def index
tasks = Task.all
render json: {
success: true,
data: ActiveModel::Serializer::CollectionSerializer.new(tasks, serializer: Api::V1::TaskSerializer)
}
end
end
ApiController là api cha của tất cả api khác kế thừa từ nó. Bạn có thể vào xem bài trước để chi tiết hơn. Khi response data thì chúng ta sử dụng serilalizer để format json một cách dễ dàng và linh hoạt.
Request
Method: GET
URL: localhost:3000/api/v1/tasks
Response
{
"success": true,
"data": [
{
"id": 1,
"title": "task1"
},
{
"id": 2,
"title": "task2"
},
{
"id": 3,
"title": "task3"
}
]
}
API Show task
# app/controllers/api/v1/tasks_controller.rb
def show
task = Task.find params[:id]
render json: {
success: true,
data: Api::V1::TaskSerializer.new(task)
}
end
Request
Method: GET
URL: localhost:3000/api/v1/tasks/1
Response
{
"success": true,
"data": {
"id": 1,
"title": "task1"
}
}
Nếu task id không tìm thấy, nó sẽ bắt luôn exception và trả về lỗi với format lỗi như đã làm trong bài trước.
Request
Method: GET
URL: localhost:3000/api/v1/tasks/999
Response
{
"success": false,
"errors": [
{
"code": 3001,
"message": "No data found."
}
]
}
API Create task
def create
task = Task.create! task_params
render json: {
success: true,
data: Api::V1::TaskSerializer.new(task)
}
end
...
private
def task_params
params.permit [:title]
end
Request
Method: POST
URL: localhost:3000/api/v1/tasks
Body:
{
"title": "aaa"
}
Response
{
"success": true,
"data": {
"id": 5,
"title": "aaa"
}
}
trong trường hợp create mà có record invalid, thì nó sẽ bắt được các exception và trả về format lỗi tương tự.
API Update task
def update
task = Task.find params[:id]
task.update_attributes! task_params
render json: {
success: true,
data: Api::V1::TaskSerializer.new(task)
}
end
Request
Method: PUT
URL: localhost:3000/api/v1/tasks/1
Body:
{
"title": "new name"
}
Response
{
"success": true,
"data": {
"id": 5,
"title": "new name"
}
}
API Delete task
def destroy
task = Task.find params[:id]
task.destroy!
render json: {
success: true
}
end
Request
Method: DELETE
URL: localhost:3000/api/v1/tasks/1
Response
{
"success": true
}
Đến đây là xong. Chúng ta đã làm xong các API cơ bản để có thể CRUD task.
All rights reserved