2010-09-29 29 views
8

Tôi nhận thấy Rails không kích hoạt gọi lại after_initialize khi biểu tượng gọi lại được chuyển làm đầu vào.ActiveRecord: Không gọi after_initialize khi tên phương thức được truyền dưới dạng một biểu tượng

Mã bên dưới không hoạt động.

class User < ActiveRecord::Base 
    after_initialize :init_data 

    def init_data 
    puts "In init_data" 
    end 

end 

Mã bên dưới hoạt động.

class User < ActiveRecord::Base 

    def after_initialize 
    init_data 
    end 

    def init_data 
    puts "In init_data" 
    end 
end 

Ai đó có thể giải thích hành vi này?

Note 1

Các ActiveRecord documentation nói sau đây về after_initialize:

Unlike all the other callbacks, after_find and after_initialize will 
only be run if an explicit implementation is defined (def after_find). 
In that case, all of the callback types will be called. 

Mặc dù nó được tuyên bố rằng after_initialize đòi hỏi thực hiện rõ ràng, tôi tìm ra câu thứ hai trong đoạn trên mơ hồ, tức là In that case, all of the callback types will be called.all of the call back types là gì?

Các mẫu mã trong tài liệu có một ví dụ mà không sử dụng thực hiện rõ ràng:

after_initialize EncryptionWrapper.new 

Trả lời

7

Theo documentation, bạn có thể không sử dụng các macro phương thức lớp kiểu cho các cuộc gọi lại after_initialize hoặc after_find:

Các callbacks after_initialize và after_find hơi khác một chút so với các số khác . Họ không có trước đây_ * đối tác và cách duy nhất để đăng ký họ bằng cách xác định chúng là các phương pháp thông thường. Nếu bạn cố gắng đăng ký after_initialize hoặc after_find bằng cách sử dụng loại macro kiểu , chúng sẽ bị bỏ qua. Hành vi này là do lý do hiệu suất , kể từ after_initialize và after_find cả hai sẽ được gọi cho mỗi bản ghi được tìm thấy trong cơ sở dữ liệu, làm chậm đáng kể các truy vấn .

Tóm lại, bạn phải xác định một phương pháp after_initialize dụ:

class User < ActiveRecord::Base 

    def after_initialize 
    do_stuff 
    end 

end 
0

Tôi khá chắc chắn rằng phương pháp gọi bởi biểu tượng cần phải được bảo vệ hoặc tư nhân.

Edit: Yep, đây là Rails 3 documentation:

Phương pháp callbacks tham khảo làm việc bằng cách xác định một phương pháp bảo vệ hoặc tư nhân có sẵn trong đối tượng

+0

tôi đã cố gắng làm cho phương pháp gọi lại tôi tin, và tôi vẫn có những hành vi tương tự. –

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