12/08/2018, 15:15

Validations in Ruby on Rails Tutorial

Bài viết này mình muốn chia sẻ kiến thức của mình về validations sau khi đọc xong Ruby on Rails Tutorial. 1. Lý do nên sử dụng validation. Validates là các thao tác kiểm tra dữ liệu trước khi lưu một object vào database. Bởi vậy, validations được sử dụng để đảm bảo rằng chỉ có dữ liệu hợp lệ ...

Bài viết này mình muốn chia sẻ kiến thức của mình về validations sau khi đọc xong Ruby on Rails Tutorial.

1. Lý do nên sử dụng validation.

Validates là các thao tác kiểm tra dữ liệu trước khi lưu một object vào database. Bởi vậy, validations được sử dụng để đảm bảo rằng chỉ có dữ liệu hợp lệ được lưu vào cơ sở dữ liệu của bạn. Trong rails có tích hợp sẵn rất nhiều validation helper, như một công cụ hữu ích giúp ta đỡ tốn thao tác kiểm tra dữ liệu trước khi lưu vào database. Như vậy, việc kiểm tra và loại bỏ các dữ liệu rác không mong muốn, hoặc dữ liệu người dùng nhập sai, không theo quy định sẽ trở nên dễ dàng hơn rất nhiều.

Ví dụ :

Khi user đăng ký tài khoản (email , password), bạn muốn rằng email phải là duy nhất, tức là chưa tồn tại trong database, trong model của user bạn có thể dùng

validate :email, uniqueness: true

thật đơn giản phải không? Bình thường trước khi save, bạn sẽ phải duyệt trong database, rồi so sánh, ... . Khá phức tạp phải không?

2. Các phương thức gọi đến validation.

Có nhiều cách để thay đổi thuộc tính của một đối tượng trong cơ sở dữ liệu. Một số phương thức sẽ kích hoạt validation, nhưng một số sẽ không. Điều này có nghĩa là bạn có thể lưu một đối tượng trong cơ sở dữ liệu mà có thuộc tính không hợp lệ nếu bạn không cẩn thận. Các phương thức sau kích hoạt validations và sẽ lưu đối tượng vào cơ sở dữ liệu chỉ khi đối tượng hợp lệ :

  • create
  • create!
  • save
  • save!
  • update
  • update!

Sự khác nhau giữa create và create! : Nếu dùng create thì sau khi check các điều kiện, nếu thỏa mãn hay không ( tức là có lưu vào database thành công hay không) thì nó cũng vẫn trả về đối tượng đó, không báo lỗi. Còn create! nếu quá trình check có lỗi thì nó sẽ báo lỗi. Tương tự với save và save! ; update và update! .

3. Các phương thức sẽ không gọi đến validations trước khi cập nhật dữ liệu.

Các phương thức sau đây sẽ bỏ qua validations(xác nhận), và sẽ lưu các đối tượng vào cơ sở dữ liệu bất kể nó có hợp lệ hay không. Chúng nên được sử dụng cẩn thận.

  • decrement!
  • decrement_counter
  • increment!
  • increment_counter
  • toggle!
  • touch
  • update_all
  • update_attribute
  • update_column
  • update_columns
  • update_counters

Lưu ý rằng save cũng có khả năng bỏ qua xác nhận nếu ta dùng : save(validate: false)

4. Validation helpers

* presence :

validates :name, presence: true

-> Không cho phép bỏ trống thuộc tính name.

* inclusion

validates :answer, inclusion: {in: [true, false]}

-> inclusion : xác nhận rằng các giá trị thuộc tính phải tồn tại trong một tập hợp nhất định. Theo ví dụ ở trên, answer chỉ có thể có giá trị là true hoặc false.

* acceptance

validates :category, acceptance: true

acceptance : là phương thức xác nhận hộp checkboxs đã được người dùng check vào khi một biểu mẫu đã được gửi. Thường được sử dụng khi người dùng cần đồng ý với các điều khoản dịch vụ của ứng dụng của bạn, xác nhận rằng một số nội dung được đọc hoặc bất kỳ khái niệm tương tự. Như trong ví dụ trên, acceptance bắt người dùng phải check vào một thể loại nào đó đã được liệt kê thì mới hợp lệ.

* uniqueness

validates :email, uniqueness: {case_sensitive: false}

Lấy lại ví dụ trong phần 1. Ở đây có thêm case_sensitive: false với mục đích là email không phân biệt hoa thường.

* length

validates :title, length: {minimum: 6}        // Độ dài của title tối thiểu là 6.
validates :title, length: {maximum: 30}       // Độ dài của title tối đa là 30
validates :title, length: {in: 6..30}         // Độ dài của title trong đoạn [6, 30]
validates :password, length: {is: 8}          // Độ dài của title là 8 (không hơn không kém)

* format

validates :name, format: {with: /A[a-zA-Z]+z/,
 message: "only allows letters"}

Yêu cầu thuộc tính name chỉ chứa ký tự.

* validates tự định nghĩa.

validate  :picture_size
def picture_size
  if image.size > 5.megabytes
    errors.add :picture, I18n.t("warning-max-size")
  end
end

5. Tham khảo

Link http://guides.rubyonrails.org/active_record_validations.html

0