Sto tentando di estendere un modello ActiveRecord (Vote
) che una gemma (https://github.com/peteonrails/vote_fu) fornisce alla mia applicazione. (Vale a dire, non v'è alcun vote.rb
in app/models
)Riapri un modello ActiveRecord fornito da una gemma
Il mio primo approccio è stato quello di creare un file chiamato lib/extend_vote.rb
che contiene il codice:
Vote.class_eval do
after_create :create_activity_stream_event
has_one :activity_stream_event
def create_activity_stream_event
# something..
end
end
Questo funziona quando viene creato il primo voto, ma quando provo a creare ogni voto successivo ottengo l'errore TypeError (can't dup NilClass)
.
penso che questo errore è causato dal fatto che la classe Vote
viene ricaricato automaticamente dopo ogni richiesta, ma il codice di lib/extend_vote.rb
viene caricato solo una volta all'avvio del server e questo fa sì che l'associazione has_one :activity_stream_event
a comportarsi stranamente. (Inoltre, il problema va via se ho impostato config.cache_classes = true
in development.rb
)
Per risolvere questo problema, ho cercato di fare il voto estensioni ricaricare su ogni richiesta con l'aggiunta di un blocco to_prepare
al mio development.rb
:
config.to_prepare do
load 'extend_vote.rb'
end
Questo risolve il problema (can't dup NilClass)
, ma ora ogni volta che creo un nuovo voto, la richiamata create_activity_stream_event
viene chiamata un tempo aggiuntivo. Il primo voto lo chiama una volta, il secondo lo chiama due volte, ecc. Ecc. Quindi sembra che il blocco to_prepare
stia ricaricando l'estensione TROPPO in modo aggressivo e aggiungendo duplicati di callback.
Qual è il modo migliore per aggiungere metodi e callback a questo modello Vote
?
Funziona se si utilizza 'class Vote' invece di' Vote.class_eval'? Una cosa che potresti fare è modificare il codice nella gemma stessa e usare la tua versione modificata. – agmcleod
'class Vote' si comporta come' Vote.class_eval' - non funziona. Immagino di poter modificare la gemma, ma davvero non voglio lol. Che casino! –
Perché pensi che la classe Voto venga ricaricata? Nella resposity, la classe è nella directory lib quindi è la stessa di te ... – Dougui