Sơ lược về validation trong Rails
Bài đăng này đã không được cập nhật trong 8 năm
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.messages
và errors.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