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 ...
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