5

Tôi đang sử dụng Rails 3.1.0 và tôi muốn biết liệu có thể xử lý các cuộc gọi lại after_saveafter_destroy "bình đẳng" hay không. Tức là, tôi cần chạy các phương thức giống nhau cho cả các cuộc gọi lại after_saveafter_destroy.Có cách nào để xử lý `after_save` và` after_destroy` "bằng nhau"?

Tại thời điểm này tôi phải xử lý những callbacks riêng ngay cả khi những hoàn để điều tương tự:

after_save do |record| 
    # Make a thing 
end 

after_destroy do |record| 
    # Make the same thing as in the 'after_save' callback 
end 

Vì vậy, có một cách để xử lý after_saveafter_destroy "bình đẳng"?

+1

Gọi cùng một phương pháp từ cả hai? –

+0

@Dave Newton - Phương pháp theo nghĩa đen là giống nhau. – Backo

+0

Tôi hiểu rằng - đó là lý do tại sao tôi đã gọi cùng một phương thức từ cả hai, cho dù bạn đang sử dụng biểu mẫu trong bài đăng của mình hay từ tham chiếu phương thức như trong câu trả lời. –

Trả lời

20

Thay vì chặn, hãy cung cấp after_saveafter_destroy tên phương thức của mô hình làm biểu tượng.

class ModelName < AR 
    after_save :same_callback_method 
    after_destroy :same_callback_method 

    def same_callback_method 
    # do the same for both callbacks 
    end 
end 
+2

Một lớp được định nghĩa với từ khóa 'lớp', không phải từ khóa' def'. – Gazler

+0

@Gazler: cũng phát hiện :) – Vapire

5
class Foo < ActiveRecord::Base 
    after_save :my_callback 
    after_destroy :my_callback 

    private 
    def my_callback 
    #Do stuff 
    end 
end 
+0

Tùy thuộc vào trường hợp sử dụng, 'protected' có thể được ưu tiên hơn là 'private' – ksol

5

Để thực hiện cuộc gọi lại tương tự sau khi cả hai tiết kiệm và phá hủy, bạn có thể sử dụng after_commit

after_commit do |record| 
    # Is called after creating, updating, and destroying. 
end 

http://apidock.com/rails/ActiveRecord/Transactions/ClassMethods/after_commit

+0

Đó là kinh nghiệm của tôi rằng điều này chỉ hoạt động khi hoạt động kích hoạt sự kiện được bao bọc trong khối giao dịch. Đường ray> = 3.2. Nó sẽ không được gọi là khác. –

+0

Điều này không giống nhau. Trong giao dịch 'after_save' chưa được cam kết, trong giao dịch' after_commit' đã được cam kết. – yivo

+0

'* _commit' chỉ được kích hoạt trong khối giao dịch. Nó không kích hoạt khi bạn 'lưu'. – fantasticfears

Các vấn đề liên quan