Xác nhận bản ghi hoạt động trong Rails Phần I

Tram Ho

Chắc hẳn khi các bạn làm việc và thao tác trên dữ liệu, điều chúng ta quan tâm nhất chính là tính đúng đắn của chúng. Mặc dù bạn đã đưa chỉ dẫn, ví dụ cho người dùng để họ có thể nhập theo nhưng vẫn có trường hợp do khả năng đọc hiểu, cố tình ghi sai để tạo lỗi hay do một lý do tâm linh nào đó mà dữ liệu nhập vào không đúng với định dạng hệ thống mong muốn, khiến cho cơ sở dữ liệu của chúng ta “đánh mất sự thuần khiết”. Để ngăn chặn điều này, Rails đã cung cấp một “công cụ” vô cùng mạnh mẽ mà mình muốn chia sẻ với các bạn trong bài viết này đó chính là Active Record Validations

Khi nào thì Validations diễn ra?

Như đã nói ở trên thì Validations được tích hợp sẵn trong Rails và tự động thực hiện khi có sự thay đổi liên quan trực tiếp đến bản ghi. Hiểu một cách đơn giản là khi chúng ta save hoặc update bản ghi thì công cụ thần kì kia sẽ phát huy sức mạnh của mình. Việc của chúng ta chỉ là gọi nó ra để nó làm vệ sĩ cho database thôi. Let’s gooo!

Validation Helpers

Active Record cung cấp cho chúng ta nhiều method validation helper để thực hiện những validates phổ biến. Tất cả các method này đều có thể xử lý nhiều trường và có 2 option. Trong đó :on sẽ chỉ định lúc nào validates được thực hiện(có 2 giá trị là :create:update). Option 2 là :message để quy đinh message errol khi validates xảy ra lỗi ( nếu không sử dụng thì message sẽ có giá trị mặc định theo Rails viết sẵn cho từng helper ). Giờ chúng ta sẽ điểm mặt cụ thể từng ứng cử viên sáng giá mà Active Record mang đến nhé:

  • acceptance

    Phương thức này sẽ xác nhận xem checkbox đã được tích hay chưa khi form được gửi. Nó thường được dùng khi người dùng cần đồng ý với các điều khoản hoạt động, hoặc xác nhận lại một vài đoạn text cần được đọc.
    Khi bạn muốn phải có giá trị khác nil với checkbox có name=”check_it” chúng ta chỉ cần sự dụng:
    validates: :ckeck_it, acceptance: true

  • validates_associated

Ta nên sử dụng khi model có liên kết với model khác và chúng cần phải được xác nhận. Khi ta cố gắng lưu object vào CSDL, valid? sẽ được gọi trong mỗi object liên kết với nó.

Xác thực này hoạt động được với tất cả các loại liên kết.
Chú ý: không sử dụng validates_associated ở cả 2 phía của liên kết. Nếu ta làm điều đó, một vòng lặp vĩnh cửu sẽ được tạo ra.

  • confirmation

Ứng cử viên thứ ba này có tác dụng kiểm tra 2 trường văn bản có đồng nhất giá trị với nhau không. Ví dụ như việc xác nhận lại mật khẩu khi đăng kí, xác thực này sẽ tạo một thuộc tính ảo, với tên của thuộc tính này được nối thêm “_confirmation”.

Còn trong view sẽ có 1 form có trường password_confirmation

Giờ thì việc kiểm tra password đơn giản không thể ngăn cản rồi.

  • exclusion

exclusion xác thực việc giá trị của attribute không được nằm trong một tập cho trước. Ví dụ như bạn không muốn trường “am_i_handsome” có giá trị “no” bạn chỉ cần áp dụng nó như sau:

Phương thức exclusion có tùy chọn :in. Trong đó sẽ chứa một tập các giá trị không hợp lệ. Tùy chọn :in có một bí danh (alias) là :within. Thuộc tính này cũng có chức năng giống như :in. Message mặc định là “is reserved”.

  • inclusion

Trái ngược với exclusion phương thức này xác thực giá trị của thuộc tính phải nằm trong một tập cho trước.

Helper inclusion có một tùy chọn là :in sẽ chỉ cho phép hợp lệ những giá trị nào có trong đó. Tùy chọn này có một bí danh (alias) là :within cũng có tác dụng tương tự.
Message mặc định là “is not included in the list”

  • format

Helper này sẽ xác thực các giá trị của thuộc tính bằng cách thực hiện kiểm tra xem có thỏa mãn một regular expression không. Tùy chọn được sử dụng là :with:

Message mặc định là: “is invalid”

  • length

Ứng cử viên cuối cùng được giới thiệu trong bài viết này có khả năng kiểm tra độ dài của giá trị thuộc tính. Nó sẽ cung cấp một số tùy chọn để ta có thể sử dụng một cách linh hoạt:

Những tùy chọn có thể dùng bao gồm:

:minimum – Thuộc tính không thể có ít hơn giá trị được thiết lập.

:maximum – Thuộc tính không thể có nhiều hơn giá trị đã được thiết lập.

:in(hoặc :within) – Chiều dài giá trị của thuộc tính phải nằm trong một khoảng nhất định.

:is Chiều dài của thuộc tính phải bằng giá trị được chỉ định.

Message lỗi mặc định phụ thuộc vào độ dài của validation được thực thi.
Ta có thể tùy chỉnh nó sử dụng tùy chọn :wrong_length,:too_long, :too_short%{count}.

Ta vẫn có thể sử dụng tùy chọn :message để thiết lập một message lỗi như các helper đã được giới thiệu ở trên.

valid? và invalid?

Như đã giới thiệu là Validates sẽ diễn ra hoàn toàn tự động vậy nếu chúng ta muốn chủ động thực hiện xác thực dữ liệu? Hãy yên tâm vì Rails đã chu đáo trang bị thêm cho chúng ta 2 phương thức invalid?valid?.
Ta có thể tự mình chạy các validations. Phương thức valid? Sẽ cho phép ta thực hiện điều này. Nó sẽ trả về true nếu không có bất kỳ lỗi nào bị sinh ra và false nếu ngược lại. Ví dụ:

Sau khi Active Record thực hiện validations, ta có thể tìm thấy những lỗi validations trong instance method errors.messages.

Theo mặc định, một object sẽ được coi là hợp lệ nếu errors.messages trả về rỗng sau khi chạy validations. Chú ý rằng một object khởi tạo với phương thức new sẽ không tạo ra lỗi dù cho nó có invalid, vì validation chỉ chạy khi object được saved, ví dụ như khi thực hiện các phương thức create, save.

Phương thức invalid? thì ngược lại với valid?.

Kết luận

Qua phần một này các bạn đã có thể thấy được tầm quan trọng của Active Record Validations trong việc hỗ trợ chúng ta thao tác, xử lý với dữ liệu. Tận dụng và phát huy những điểm mạnh mà Active Record Validations mang lại sẽ giúp hệ thống của các bạn hoàn thiện và chuyên nghiệp hơn rất nhiều.

Cảm ơn các bạn đã đọc hết bài viết, hẹn gặp lại ở phần II ^.^

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo