2015-08-20 8 views
7

Mi sono imbattuto in un problema piuttosto fastidioso quando si trattava di anteprime di Rails 4 e di factory girl. Ecco un esempio di alcuni dei miei codici:Rails 4 Anteprime di Mailer di azione e problemi di Factory Girl

class TransactionMailerPreview < ActionMailer::Preview 
    def purchase_receipt 
    account = FactoryGirl.build_stubbed(:account) 
    user = account.owner 
    transaction = FactoryGirl.build_stubbed(:transaction, account: account, user: user) 
    TransactionMailer.purchase_receipt(transaction) 
    end 
end 

Questa potrebbe essere davvero un'anteprima dell'anteprima dell'azione. Diciamo che ricevo qualcosa di sbagliato (succede ogni volta) e c'è un errore. Risolvi l'errore e aggiorno la pagina. Ogni volta che questo accade ottengo un:

"ArgumentError in Rails :: MailersController # preview Una copia di User è stata rimossa dall'albero del modulo ma è ancora attiva!"

Quindi la mia unica via d'uscita è riavviare il mio server.

Mi manca qualcosa qui? Qualche indizio su cosa sta causando questo e come potrebbe essere evitato? Ho riavviato il mio server 100 volte nell'ultima settimana a causa di questo.

MODIFICA: Potrebbe accadere in qualsiasi momento che modifichi il mio codice e aggiorni l'anteprima?

risposta

0

Anche se questa non è esattamente una risposta (ma forse un indizio), ho avuto anche questo problema.

Le vostre fabbriche causano effettivamente la permanenza di qualsiasi record?

Ho finito con l'utilizzo di Factory.build dove ho potuto e ho eliminato tutto il resto con metodi privati ​​e OpenStructs per assicurarmi che tutti gli oggetti venissero creati freschi su ogni ricarica, e nulla stava continuando a essere ricaricato.

Mi chiedo se quello che FactoryGirl.build_stubbed utilizza per ingannare il sistema nel pensare che gli oggetti siano persistenti stanno causando il sistema per provare a ricaricarli (dopo che sono andati).

Ecco un frammento di ciò che sta lavorando per me:

class SiteMailerPreview < ActionMailer::Preview 

    def add_comment_to_page 
    page = FactoryGirl.build :page, id: 30, site: cool_site 
    user = FactoryGirl.build :user 
    comment = FactoryGirl.build :comment, commentable: page, user: user 
    SiteMailer.comment_added(comment) 
    end 

    private 

    # this works across reloads where `Factory.build :site` would throw the error: 
    # A copy of Site has been removed from the module tree but is still active! 
    def cool_site 
    site = FactoryGirl.build :site, name: 'Super cool site' 
    def site.users 
     user = OpenStruct.new(email: '[email protected]') 
     def user.settings(sym) 
     OpenStruct.new(comments: true) 
     end 
     [user] 
    end 
    site 
    end 

end 

anche se non sono del tutto soddisfatto di questo approccio, non ottengo più quegli errori.

Sarei interessato a sapere se qualcun altro ha una soluzione migliore.

Problemi correlati