2015-08-20 9 views
7

Występuję w dość irytującym problemie, gdy zajmuję się zapowiedziami mailersowymi i fabryką Rails 4. Oto przykład niektórych z mojego kodu:Rails 4 Action Mailer Previews and Factory Girl issues

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 

To naprawdę może być jakikolwiek podgląd akcji mailera. Powiedzmy, że coś złego dzieje się (dzieje się za każdym razem) i jest błąd. Naprawię błąd i odświeżam stronę. Za każdym razem, gdy tak się dzieje, otrzymuję:

"ArgumentError w Rails :: MailersController # preview Kopia użytkownika została usunięta z drzewa modułów, ale nadal jest aktywna!"

Moim jedynym wyjściem jest ponowne uruchomienie serwera.

Czy tu czegoś brakuje? Jakąkolwiek wskazówkę na temat tego, co jest przyczyną tego i jak można tego uniknąć? W związku z tym zresetowałem mój serwer 100 razy w zeszłym tygodniu.

EDYCJA: To może faktycznie zdarzyć się za każdym razem, gdy edytuję mój kod i odświeżam podgląd?

Odpowiedz

0

Chociaż nie jest to dokładnie odpowiedź (ale być może wskazówka), mam również ten problem.

Czy twoje fabryki powodują utratę jakichkolwiek zapisów?

W końcu udało mi się użyć Factory.build, gdzie mogłem, i wyczerpałem całą resztę prywatnymi metodami i OpenStructs, aby mieć pewność, że wszystkie obiekty były tworzone świeżo przy każdym ponownym załadowaniu i nic nie przetrwało, aby je ponownie załadować.

Zastanawiam się, czy to, co FactoryGirl.build_stubbed używa do oszukiwania systemu w myśleniu, że obiekty są utrwalone, powoduje, że system próbuje je ponownie załadować (po tym, jak znikną).

Oto fragment tego, co działa dla mnie:

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 

Choć nie jestem całkowicie zadowolony z tego podejścia, nie rozumiem już tych błędów.

Chciałbym usłyszeć, czy ktoś inny ma lepsze rozwiązanie.

Powiązane problemy