+5

Sơ lược về validation trong Rails

Khái niệm validation có lẽ không xa lạ gì với những lập trình viên, validation hiểu đơn giản là các quy tắc được lập trình viên đặt ra để xác minh tính đúng đắn của dữ liệu trước khi lưu vào cơ sở dữ liệu.

Dưới đây là một ví dụ đơn giản về validation:

class User < ApplicationRecord
  validates :name, presence: true, length: {maximum: 50},
  validates :email, presence: true, length: {maximum: 255},
end

Validation trên có thể hiểu là thuộc tính name và email không được rỗng, có độ dài tối đa là 50 ký tự và 255 ký tự. Để kiểm tra tính hơp lệ, ta dùng phương thức valid?

$ rails console --sandbox
> user = User.new(name: nil, email: nil)
> user.valil
=> false
> user.invalid?
=> true

Phương thức valid? trả về false nếu đối tượng vi phạm một hoặc nhiều validation, trả về true nếu đối tượng thỏa mãn tất cả các validation. Phương thức invalid? là phương thức ngược lại của valid?.

Phương thức errors.messageserrors.full_messages dùng để in ra lỗi giúp lập trình viên xác định validation nào bị vi phạm.

> user.errors.messages
=> {:name=>["can't be blank"], :email=>["can't be blank"]}
> user.errors.full_messages
=> ["Name can't be blank", "Email can't be blank"]
> user.save
=> false

Bởi vì đối tượng vi phạm validation nên không thể lưu vào cơ sở dữ liệu.

Rails cung cấp nhiều validation helper để lập trình viên có thể sử dụng trực tiếp trong validation của mình. Các validation helper thường có sẵn thông báo lỗi mặc định, tuy nhiên vẫn có thể tùy chỉnh được. Dưới đây là một số validation helper của Rails:

- acceptance

Helper này thường được dùng cho ô checkbox yêu cầu người dùng đồng ý với một điều khoản nào đó, tùy chỉnh thông báo lỗi thông qua option message, nếu ko dùng option này sẽ tự xuất ra thông báo mặc định là "must be accepted"

class Person < ApplicationRecord
  validates :terms_of_service, acceptance: true,
    message: 'must be abided'
end

- confimation

Helper này được dùng khi có 2 textbox trả về cùng 1 dữ liệu, ví dụ như khi muốn xác nhận địa chỉ email hay mật khẩu, nó sẽ tự tạo ra một thuộc tính ảo là tentruong_confimation và so sánh giá trị

class Person < ApplicationRecord
  validates :email, confirmation: true
  #thông báo lỗi mặc định "doesn't match confirmation".
end

- inclusion/exclusion

Hai helper này để xác định giá trị của một thuộc tính nằm trong/không nằm trong một tập hợp

class Person < ApplicationRecord
  validates :literacy, inclusion: { in: %w(college university)}
  #thông báo lỗi mặc định "is not included in the list".
  validates :literacy, exclusion: { in: %w(college university)}
  #thông báo lỗi mặc định "is reserved".
end

- format

Helper này dùng để đảm bảo giá trị của thuộc tính khớp với một định dạng mình mong muốn, sử dụng regular expression

class Person < ApplicationRecord
  validates :name, format: { with: /\A[a-zA-Z]+\z/,
    message: "only allows letters" }
    #thông báo lỗi mặc định "is invalid".
end

- length

Helper này quy ước độ dài của giá trị, có thể là một số cụ thể hoặc một khoảng

class Person < ApplicationRecord
  validates :name, length: { minimum: 2 }
  validates :bio, length: { maximum: 500 }
  validates :password, length: { in: 6..20 }
  validates :registration_number, length: { is: 6 }
end

- presence

Helper này yêu cầu thuộc tính phải có giá trị, không được để trống

class Person < ApplicationRecord
  validates :name, :login, :email, presence: true
end

- uniqueness

Helper này đảm bảo giá trị của thuộc tính là duy nhất

class Account < ApplicationRecord
  validates :email, uniqueness: true
  #thông báo lỗi mặc định "has already been taken"
end

Ngoài ra có 1 số option đi kèm với helper, ví dụ như allow_nil là cho phép bỏ qua validation khi giá trị là nil, allow_blank là cho phép bỏ qua validation khi giá trị là nil hoặc chuỗi rỗng, messange dùng để quy định nội dung thông báo hiển thị lỗi, on dùng khi chỉ muốn validate ở một số trường hợp cụ thể

Nguồn tham khảo http://guides.rubyonrails.org/active_record_validations.html


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí