2015-08-20 4 views
7

Ich habe in ein ziemlich nerviges Problem mit Rails 4 Action Mailer Previews und Factory Girl gerannt. Hier ist ein Beispiel für einige meiner Code:Rails 4 Action Mailer Previews und Factory Girl Probleme

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 

Dies könnte wirklich jede Aktion Mailer Vorschau sein. Sagen wir, ich bekomme etwas falsch (passiert jedes Mal), und es ist ein Fehler. Ich behebe den Fehler und aktualisiere die Seite. Jedes Mal, wenn dies passiert, bekomme ich eine:

"ArgumentError in Rails :: MailersController # Vorschau Eine Kopie des Benutzers wurde aus dem Modulbaum entfernt, ist aber immer noch aktiv!"

Dann ist mein einziger Ausweg, meinen Server neu zu starten.

Fehle ich hier etwas? Irgendwelche Hinweise darauf, was das verursacht und wie es vermieden werden könnte? Ich habe meinen Server deshalb in der letzten Woche 100 Mal neu gestartet.

EDIT: Es kann tatsächlich passieren, wenn ich meinen Code bearbeiten und die Vorschau aktualisieren?

Antwort

0

Obwohl dies nicht gerade eine Antwort ist (aber vielleicht ein Hinweis), hatte ich dieses Problem auch.

Führen Ihre Fabriken dazu, dass irgendwelche Aufzeichnungen tatsächlich bestehen bleiben?

Ich landete mit Factory.build, wo ich konnte, und stoppte alles andere mit privaten Methoden und OpenStructs, um sicher zu sein, alle Objekte wurden bei jedem Neuladen frisch erstellt, und nichts wurde beibehalten, neu geladen werden.

Ich wundere mich, wenn was FactoryGirl.build_stubbed verwendet, um das System zu glauben, dass die Objekte persistent sind verursachen das System zu versuchen und neu laden sie (nachdem sie weg sind).

Hier ist ein Ausschnitt von dem, was für mich funktioniert:

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 

Obwohl ich mit diesem Ansatz nicht ganz zufrieden bin, verstehe ich nicht, diese Fehler nicht mehr.

Ich wäre interessiert zu hören, ob jemand andere eine bessere Lösung hat.