2012-07-17 24 views
25

Tôi đã đi qua các nguồn rails trong một thời bây giờ, và tôi không nghĩ rằng có một cách tốt hơn để có được danh sách của tất cả callbacks khác hơn: ActiveRecord::Callbacks::CALLBACKS - đó là một danh sách liên tục.ActiveRecord Callbacks List

Ý nghĩa nếu bạn đang sử dụng một viên ngọc như devise_invitable có thêm một callback mới gọi là :invitation_accepted với số điểm :after:before sau đó ActiveRecord::Callbacks::CALLBACKS sẽ không hoạt động.

Bạn có biết cách sửa chữa dễ dàng, ngoài việc mở các mô-đun đường ray và đảm bảo có danh sách quay lại cuộc gọi nội bộ cho mỗi lớp mô hình?

Trả lời

37

Bạn có thể gọi Model._save_callbacks để nhận danh sách tất cả các cuộc gọi lại khi lưu. Sau đó, bạn có thể lọc nó xuống theo loại bạn cần, ví dụ: :before hoặc :after như thế này:

Model._save_callbacks.select {|cb| cb.kind == :before} 

Làm tương tự cho Model._destroy_callbacks, vv

+2

Ngoài ra kiểm tra các tài liệu để biết chi tiết hơn: http://apidock.com/rails/ActiveRecord/Callbacks –

3

Lưu ý rằng nếu bạn chỉ đơn giản là muốn kích hoạt callbacks, bạn có thể sử dụng phương pháp #run_callbacks(kind):

o = Order.find 123 # Created with SQL 
o.run_callbacks(:create) 
o.run_callbacks(:save) 
o.run_callbacks(:commit) 
17

Các docs nói "Có tổng cộng mười chín callbacks trong tổng số" ... nhưng họ dường như không nói tất cả những gì thực sự là 19!

Đối với những người đã google "danh sách của tất cả các callbacks ActiveRecord" như tôi đã làm, đây là danh sách (tìm thấy bằng cách sử dụng ActiveRecord::Callbacks::CALLBACKS như mô tả trong câu hỏi):

:after_initialize 
:after_find 
:after_touch 
:before_validation 
:after_validation 
:before_save 
:around_save 
:after_save 
:before_create 
:around_create 
:after_create 
:before_update 
:around_update 
:after_update 
:before_destroy 
:around_destroy 
:after_destroy 
:after_commit 
:after_rollback 
+0

Oh, và tôi vừa phát hiện ra họ được liệt kê [ở đây] (http://edgeguides.rubyonrails.org/ active_record_callbacks.html), trong hướng dẫn. Tuy nhiên, tôi hy vọng câu trả lời này sẽ giúp bạn tiết kiệm thời gian của Google trong tương lai. – GMA

2

Nếu bạn đang làm việc trong một phiên bản Rails trước khi phương pháp ._save_callbacks, bạn có thể sử dụng như sau:

# list of callback_chain methods that return a CallbackChain 
Model.methods.select { |m| m.to_s.include? "callback" }.sort 

# get all methods in specific call back chain, like after_save 
Model.after_save_callback_chain.collect(&:method)