2011-09-16 16 views
49

Có thể định nghĩa một callback before_save trong một module? Như vậy mà với một lớp học như thế này:Có thể xác định cuộc gọi lại 'before_save' trong mô-đun không?

class Model 
    include MongoMapper::Document 
    include MyModule 
end 

và một mô-đun như thế này:

module MyModule 
    before_save :do_something 

    def do_something 
    #do whatever 
    end 
end 

do_something sẽ được gọi trước khi bất kỳ Model đối tượng được cứu? Tôi đã thử nó như thế này nhưng nhận được undefined method 'before_save' for MyModule:Module.

Xin lỗi nếu nó đơn giản - tôi mới dùng Ruby và Rails.

Trả lời

95

Trong Ruby on Rails < 3 (không có Rails tính năng, chỉ của Ruby)

module MyModule 
    def self.included(base) 
    base.class_eval do 
     before_save :do_something 
    end 
    end 

    def do_something 
    #do whatever 
    end 
end 

Trong Ruby on Rails> = 3 (với Rails Concern tính năng)

module MyModule 
    extend ActiveSupport::Concern 

    included do 
    before_save :do_something 
    end 

    def do_something 
    #do whatever 
    end 
end 
+1

Hoạt động hoàn hảo - cảm ơn! – Russell

+0

Cách tiếp cận cho Rails <3 không hoạt động trong Rails> = 3? Tôi đang làm điều đó và gọi lại 'before_validation' của tôi không xuất hiện để được gọi. – Bradley

+0

Nó cũng sẽ hoạt động. –

4

Phương thức included của mô-đun có thể là những gì bạn cần.

http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-included

+0

này trả lời các điểm theo một hướng rất hữu ích, nhưng có thể sử dụng một ví dụ mã ngắn gọn và/hoặc thảo luận về việc sử dụng phương thức 'include' trong tình huống này. – Jessa

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