Validation Context trong ActiveRecord

Giới thiệu Validation contexts là một tính năng vô cùng thiết thực của ActiveRecord. Đó là một cách để ràng buộc xác thực mô hình trong một ngữ cảnh sử dụng cụ thể cho một bản ghi. Cách dùng Ở đây mình có 1 model là User classUser<ApplicationRecord belongs_to :club, optional:true validates :name, presence:{ message:"must

image.png

Giới thiệu

Validation contexts là một tính năng vô cùng thiết thực của ActiveRecord. Đó là một cách để ràng buộc xác thực mô hình trong một ngữ cảnh sử dụng cụ thể cho một bản ghi.

Cách dùng

Ở đây mình có 1 model là User

classUser<ApplicationRecord
  belongs_to :club, optional:true 
  validates :name, presence:{ message:"must be given please"}
  validates :club, presence:{ message:"must be given please"}end

name và club được validate cả khi create hoặc update user. Vấn đề ở đây là mình chỉ muốn validate cho một action nào đó thì làm thế nào? Rất đơn giản, Rails đã cung cấp cho ta một giá trị tuỳ chọn on cho phép ta có thể kiểm soát thời điểm validate.

classUser<ApplicationRecord
  belongs_to :club, optional:true 
  validates :name, presence:{ message:"must be given please"}, on::create
  validates :club, presence:{ message:"must be given please"}, on::updateend

Điều này cho phép create user mà không cần phải có club, nhưng sẽ bị validte trong trường hợp update user. Điều này thường được sử dụng để cho phép người dùng đăng ký với lượng thông tin tối thiểu và sau đó buộc họ cập nhật hồ sơ của mình với nhiều thông tin hơn trong các lần truy cập tiếp theo.

Giá trị cho tùy chọn on không bị giới hạn chỉ cho việc để create và update mà chúng ta có thể tự tạo custom contexts của riêng mình.

classUser<ApplicationRecord
  validate :basic_info, on::basic_info
  validate :education_details, on::education_details
  validate :professional_info, on::professional_infoprivatedefbasic_info# Validation for basic info, first_name, last_name, emailenddefeducation_details# Validation for education_detailsenddefprofessional_info# Validation for professional_infoendend

Trong user controller ta viết như sau:

classUsersController<ApplicationController#do_somethingdefupdate_basic_info@user.assign_attributes(basic_info_params)@user.save(:basic_info)enddefupdate_education_details@user.assign_attributes(education_details_params)@user.save(:education_details)enddefupdate_professional_info@user.assign_attributes(professional_info_params)@user.save(:professional_info)endprivatedefbasic_info_params# strong paramsenddefeducation_details_params# strong paramsenddefprofessional_info_params# strong paramsendend

Từ Rails 5 trở đi đã hỗ trợ cho nhiều context, chúng ta có thể sử dụng nhiều context cùng nhau

@user.save(:basic_info, :professional_info)

Ngoài ra, chúng ta có thể dùng nhiều validation trong cùng 1 context với with_options

with_options on: :create do
  validates :name, presence: true
  validates :email, presence: true
end

Trên đây mình trình bày sơ lược về cách sử dụng validation context. Hi vọng nó giúp ích được cho các bạn. Cảm ơn các bạn đã theo dõi!

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,