Otwórz ponownie model ActiveRecord dostarczany przez klejnot
Próbuję rozszerzyć model ActiveRecord (Vote
) że klejnot (https://github.com/peteonrails/vote_fu) zapewnia moją aplikację. (To znaczy, nie mavote.rb
wapp/models
)
Moim pierwszym podejściem było stworzenie pliku o nazwielib/extend_vote.rb
który zawiera kod:
Vote.class_eval do
after_create :create_activity_stream_event
has_one :activity_stream_event
def create_activity_stream_event
# something..
end
end
Działa to, gdy tworzony jest pierwszy głos, ale gdy próbuję utworzyć każdy kolejny głos, otrzymuję błądTypeError (can't dup NilClass)
.
Myślę, że ten błąd jest spowodowany tym, żeVote
klasa jest ładowana automatycznie po każdym żądaniu, ale kod wlib/extend_vote.rb
jest ładowany tylko raz podczas uruchamiania serwera i powoduje tohas_one :activity_stream_event
stowarzyszenie zachowywać się dziwnie. (Ponadto problem zniknie, jeśli ustawięconfig.cache_classes = true
wdevelopment.rb
)
Aby rozwiązać ten problem, starałem się, aby rozszerzenia głosowe przeładowywały się na każde żądanie, dodającto_prepare
blok do mojegodevelopment.rb
:
config.to_prepare do
load 'extend_vote.rb'
end
To rozwiązuje(can't dup NilClass)
problem, ale teraz, kiedy tworzę nowy głos,create_activity_stream_event
wywołanie zwrotne jest wywoływane przez dodatkowy czas. To znaczy, pierwszy głos wywołuje go raz, drugi wywołuje go dwa razy, itd. Itd. Wygląda więc na to, żeto_prepare
blok przeładowuje rozszerzenie ZBYT agresywnie i dodaje zduplikowane wywołania zwrotne.
Jaki jest najlepszy sposób dodawania metod i wywołań zwrotnych do tegoVote
Model?