Phương thức Callbacks trong Rails
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 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! ^^