+4

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

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í