Tôi đang cố gắng mở rộng mô hình ActiveRecord (Vote
) mà một viên đá quý (https://github.com/peteonrails/vote_fu) cung cấp cho ứng dụng của tôi. (Tức là, không có vote.rb
trong app/models
)Mở lại mô hình ActiveRecord do đá quý cung cấp
tiếp cận đầu tiên của tôi là tạo ra một tập tin gọi là lib/extend_vote.rb
có chứa mã:
Vote.class_eval do
after_create :create_activity_stream_event
has_one :activity_stream_event
def create_activity_stream_event
# something..
end
end
này hoạt động khi bỏ phiếu đầu tiên được tạo ra, nhưng khi tôi cố gắng tạo mỗi phiếu bầu tiếp theo tôi nhận được lỗi TypeError (can't dup NilClass)
.
Tôi nghĩ rằng lỗi này là do thực tế là lớp Vote
được tải lại tự động sau mỗi yêu cầu, nhưng mã trong lib/extend_vote.rb
chỉ được tải một lần khi máy chủ khởi động và điều này làm cho liên kết has_one :activity_stream_event
hoạt động một cách kỳ lạ. (Ngoài ra, vấn đề đi xa nếu tôi đặt config.cache_classes = true
trong development.rb
)
Để giải quyết vấn đề này, tôi đã cố gắng để làm cho cuộc bỏ phiếu mở rộng reload trên mọi yêu cầu bằng cách thêm một khối to_prepare
-development.rb
tôi:
config.to_prepare do
load 'extend_vote.rb'
end
Điều này giải quyết vấn đề (can't dup NilClass)
, nhưng bây giờ bất cứ khi nào tôi tạo một phiếu bầu mới, cuộc gọi lại create_activity_stream_event
được gọi là thời gian bổ sung. Tức là, cuộc bỏ phiếu đầu tiên gọi nó một lần, cuộc bỏ phiếu thứ hai gọi nó hai lần, v.v. Vì vậy, có vẻ như khối to_prepare
đang tải lại phần mở rộng TOO tích cực và thêm các cuộc gọi lại trùng lặp.
Cách tốt nhất để thêm phương thức và gọi lại cho kiểu Vote
này là gì?
Tính năng này có hoạt động nếu bạn chỉ sử dụng 'hạng Vote' thay vì' Vote.class_eval'? Một điều bạn có thể làm là chỉnh sửa mã trong đá quý và chỉ sử dụng phiên bản đã sửa đổi của bạn. – agmcleod
'lớp Vote' hoạt động giống như' Vote.class_eval' - không hoạt động. Tôi đoán tôi có thể sửa đổi đá quý, nhưng tôi thực sự thực sự không muốn lol. Thật là một mớ hỗn độn! –
Tại sao bạn nghĩ rằng lớp Vote được tải lại? Trong sự tôn trọng, lớp học nằm trong thư mục lib nên nó giống với bạn ... – Dougui