Bir ActiveRecord modelini (Vote
) uygulamayıma bir mücevher (https://github.com/peteonrails/vote_fu) sağlamaya çalışıyorum. Benim ilk yaklaşım, bir dosya kodunu içerdiğini lib/extend_vote.rb
denilen yaratmaktıBir mücevher tarafından sağlanan bir ActiveRecord modelini yeniden açın
(Yani, app/models
hiçbir vote.rb
yoktur):
Vote.class_eval do
after_create :create_activity_stream_event
has_one :activity_stream_event
def create_activity_stream_event
# something..
end
end
bu ilk oy oluşturulduğunda çalışır, ancak ben çalıştığınızda Sonraki her oyu oluşturmak için TypeError (can't dup NilClass)
hatasını aldım.
Bu hata Vote
sınıf her istekten sonra otomatik olarak tekrar edilir, ancak bu has_one :activity_stream_event
dernek tekinsizce davranmaya sunucu başlar ve neden olduğunda lib/extend_vote.rb
kod sadece bir kez yüklenir gerçeğiyle kaynaklanır düşünüyorum.
config.to_prepare do
load 'extend_vote.rb'
end
:
Bu sorunu çözmek için (Ayrıca, sorun ben config.cache_classes = true
development.rb
belirlenen eğer uzağa gider), ben benim development.rb
bir to_prepare
blok ekleyerek uzantıları her istekte yeniden oylama yapmaya çalıştı Bu, (can't dup NilClass)
sorununu çözer, ancak şimdi yeni bir oy oluşturduğumda, create_activity_stream_event
geri arama ek süre çağrılır. İlk olarak, ilk oylama bir kez, ikinci kez iki kez, vb. Olarak adlandırılır. Yani to_prepare
bloğu, ag'ı agresif olarak yeniden yükleyerek yinelenen geri aramalar ekliyor gibi görünüyor.
Bu Vote
modeline yöntemler ve geri bildirimler eklemenin en iyi yolu nedir?
"Vote.class_eval" yerine "sınıf oyu" kullanırsanız işe yarar mı? Yapabileceğin bir şey de kodu geminin kendisinde düzenlemek ve sadece değiştirilmiş versiyonunu kullanmak. – agmcleod
'sınıf Oylama ', Vote.class_eval' ile aynı davranır - ne işe yaramıyor. Ben gem değiştirebilir sanırım, ama gerçekten gerçekten lol istemiyorum. Ne dağınıklık! –
Oylama sınıfının yeniden yüklenmesinden neden sandınız? Reşitlik içinde, sınıf lib dizinindedir, bu yüzden sizden de aynıdır ... – Dougui