10

Tôi có một mô-đun ActiveSupport :: Lo ngại trông gần giống như sau:phương pháp Overriding trong một module ActiveSupport :: Lo ngại được xác định bởi một phương pháp lớp trong mô-đun cùng

module MyModel 
    module Acceptance 

    extend ActiveSupport::Concern 

    included do 
     enum status: [:declined, :accepted] 
    end 

    def declined! 
     self.status = :declined 
     # some extra logic 
     self.save! 
    end 

    def accepted! 
     self.status = :accepted 
     # some extra logic 
     self.save! 
    end 
    end 
end 

này chỉ là bao giờ đi được đưa vào các lớp ActiveRecord, do đó việc sử dụng enum. Về cơ bản, tôi đang ghi đè các phương thức declined!accepted! được tạo bởi ActiveRecord::Enum.enum với một số logic tùy chỉnh của riêng tôi.

Vấn đề là, điều này không có tác dụng, bởi vì khi tôi gọi @model.declined! thì các cuộc gọi đó gọi là triển khai ban đầu là declined! và bỏ qua phương thức tùy chỉnh của tôi.

Hình như phương pháp tùy chỉnh của tôi đang được đưa vào lớp gọi trước khối bao gồm đang được chạy - có nghĩa là phương pháp tùy chỉnh của tôi đang bị vô hiệu hóa bởi những người được xác định bởi enum, thay vì cách khác xung quanh.

Có một số cách giải quyết dễ dàng trong trường hợp cụ thể này (ví dụ: tôi có thể di chuyển cuộc gọi enum trở lại lớp đã bao gồm và đảm bảo rằng nó ở trên dòng include MyModel::Acceptance, nhưng tôi tự hỏi liệu có cách nào tôi có thể giải quyết vấn đề này hay không tất cả trong cùng một module.

có cách nào tôi có thể gọi một phương thức lớp trong included định nghĩa một phương pháp dụ, sau đó ghi đè lên rằng phương pháp dụ từ trong cùng một mô-đun Concern?

Trả lời

8

tôi nghĩ bạn đang tìm kiếm define_method.

+0

Bạn có thể giải thích lý do tại sao tính năng này hoạt động không? Trong Rails 3.2 @ GeorgeMillo của cách hoạt động tốt. Trong Rails 4.2 nó không có. Họ đã thay đổi một cái gì đó nội bộ về cách thức các phương pháp được thêm vào? –

+0

Tôi vừa đọc lại câu hỏi và có một lời giải thích ở đó. Nhưng bất kỳ thông tin bổ sung sẽ được biết ơn chấp nhận :) –

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