2012-02-14 18 views
7

Tôi đang cố gắng để có được ActiveModel :: Callbacks để làm việc với ActiveResource (cụ thể after_initialize) cho một ứng dụng Rails 3, nhưng tôi dường như không thể làm cho nó hoạt động. Tôi không nhận được bất kỳ lỗi nào, nhưng phương thức gọi lại không bao giờ được thực thi.Bắt ActiveModel :: Gọi lại để làm việc với ActiveResource

Dưới đây là một đoạn mã

class User < ActiveResource::Base 
    extend ActiveModel::Callbacks 
    define_model_callbacks :initialize, :only => :after 

    after_initialize :update_info 

    def update_info 
    puts 'info' 
    end 
end 

Đối với một số lý do, update_info không bao giờ được thực thi. Bất cứ ai có bất kỳ ý tưởng làm thế nào để có được điều này để làm việc?

Trả lời

7

Trong trường hợp bất kỳ ai quan tâm, tôi đọc lại tài liệu về điều này và những gì tôi nghĩ là giải thích cách mã hoạt động dưới trang bìa, hóa ra là yêu cầu phải ghi đè phương pháp tôi đã thêm callbacks để:

def initialize(attributes = {}, persisted = false) 
    run_callbacks :initialize do 
    super(attributes, persisted) 
    end 
end 

Điều này có vẻ vô cùng phản trực giác đối với tôi, vì nó hy vọng bạn theo dõi xuống chữ ký của phương pháp hiện có, ghi đè lên nó, và thêm các chức năng gọi lại. Tôi hy vọng tôi đang thiếu một cái gì đó ở đây, và chỉ đơn giản là làm cho một sai lầm, nhưng tôi đã không nhận được bất kỳ giải pháp khác để làm việc.

Anyways, đây là một bản vá khỉ để cung cấp gọi lại này cho tất cả các lớp AR:

module ActiveResource 
    class Base  
    extend ActiveModel::Callbacks 
    define_model_callbacks :initialize, :only => :after 

    def initialize_with_callback(attributes = {}, persisted = false) 
     run_callbacks :initialize do 
     initialize_without_callback(attributes, persisted) 
     end 
    end 
    alias_method_chain :initialize, :callback 
    end 
end 
+1

này là khá đáng thất vọng, nhưng dường như bạn là đúng. https://github.com/rails/rails/blob/master/activemodel/lib/active_model/callbacks.rb – tybro0103

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