Có thể thực hiện công việc này mà không cần phải bao gồm mô-đun ở cuối lớp và chỉ bao gồm mô-đun ở trên cùng không?Mô-đun để bọc một phương pháp lớp học?
module VerboseJob
def self.included(job_class)
class << job_class
alias_method :original_perform, :perform
def perform(*args)
JobLogger.verbose { original_perform(*args) }
end
end
end
end
class HelloJob
include VerboseJob
def self.perform(arg1, arg2)
puts "Job invoked with #{arg1} and #{arg2}"
end
end
Những gì tôi muốn xảy ra, là cho HelloJob.perform
để thực sự gọi VerboseJob.perform
(mà sau đó gọi phương thức ban đầu bên trong một khối). Vì mô-đun ở đây được bao gồm ở đầu lớp, điều này không có tác dụng, vì perform
chưa được xác định. Di chuyển các include
đến cùng không làm việc, nhưng có một cách đó là một chút tha thứ hơn? Tôi muốn giữ tất cả các mô-đun đi kèm ở đầu các định nghĩa lớp của tôi.
Tôi sắp tìm một số phương thức được gọi là Module
hoặc Class
khi được tải đầy đủ, thay vì được giải thích bởi thời gian chạy.
Tại sao không chỉ sử dụng 'method_added' để bọc' hoạt động' khi nó được .. er .. thêm? :) –
Tôi không chắc chắn tôi có ý nghĩa của bạn, tôi không làm điều đó? –
Tôi lấy câu trả lời của bạn (kết hợp với http://pivotallabs.com/users/rolson/blog/articles/1162-redefine-a-method-from-a-module-like-a-gentleman này) và đã đưa ra ngắn gọn hơn https://gist.github.com/1170661 (nó hoạt động không có vấn đề nơi 'bao gồm' được thực hiện). Vui lòng chỉnh sửa câu trả lời của bạn. Tôi vẫn chấp nhận nó :) – d11wtq