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!
và 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
?
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? –
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 :) –