Phương thức Callbacks trong Rails
Bài đăng này đã không được cập nhật trong 7 năm
Callback là các phương thức được gọi tới vào một thời điểm nào đó trong vòng đời của một đối tượng. Callback thường được dùng để thực thi các phương thức logic trước hoặc sau khi đối tượng được created, updated, saved, deleted, validated hoặc load từ cơ sở dữ liệu.
Bởi vì là một phương thức nên callback cần được khai báo trong model trước khi sử dụng, có 2 cách khai báo là khai báo như một phương thức bình thường, hoặc là truyền trực tiếp block vào thay tên hàm, cách này được dùng khi chỉ có một dòng lệnh bên trong block.
Cách khai báo bình thường:
class Topic < ActiveRecord::Base
before_destroy :destroy_author
private
def destroy_author
...
end
end
Cách khai báo qua block
class Topic < ActiveRecord::Base
before_destroy do
...
end
end
Với cách khai báo này, callback sẽ được áp dụng với tất cả action có thể áp dụng trong Controller, để áp dụng với một hoặc một số action cụ thể, ta viết
before_save :update_product, on: :update
after_save :send_email, on: [:create, :update]
Dưới đây là danh sách các callback có sẵn và thường được dùng trong Rails
Creating an Object
- before_validation
- after_validation
- before_save
- around_save
- before_create
- around_create
- after_create
- after_save
- after_commit/after_rollback
Updating an Object
- before_validation
- after_validation
- before_save
- around_save
- before_update
- around_update
- after_update
- after_save
- after_commit/after_rollback
Destroying an Object
- before_destroy
- around_destroy
- after_destroy
- after_commit/after_rollback
Trong một vài trường hợp, có thể bỏ qua callback với phương thức skip_callback
class Writer < Person
skip_callback :validate, :before, :check_membership,
if: -> { self.age > 18 }
end
Callback có thể được gọi đến thông qua kế thừa
class Topic < ActiveRecord::Base
before_destroy :destroy_author
end
class Reply < Topic
before_destroy :destroy_readers
end
Ở đây khi ta thực hiện action destroy topic, nó chỉ gọi phương thức destroy_author
, nhưng khi thực hiện action destroy reply, nó sẽ gọi đến cả phương thức destroy_author
và destroy_readers
. Nếu không muốn như vậy có thể sử dụng phương pháp ghi đè
class Topic < ActiveRecord::Base
def before_destroy() destroy_author end
end
class Reply < Topic
def before_destroy() destroy_readers end
end
Mong bài viết này có thể giúp các bạn hiểu thêm phần nào về Callback! Cảm ơn đã theo dõi! ^^
All rights reserved