2014-05-17 8 views
24

Mam zupełnie nową aplikację Rails 4.1.1, w której dostosowuję wiadomości e-mail od Devise. Chcę mieć je wyświetlane na funkcję podglądu email nowe Rails tak zrobiłem następujące:Rails 4.1 Mailer Podgląd i tworzenie niestandardowych wiadomości e-mail

1) Dodano następujący fragment mojego config/development.rb pliku:

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews" 

2) utworzona mój zwyczaj Opracować email UserMailer w app/mailers/user_mailer.rb:

class UserMailer < Devise::Mailer 
    helper :application # gives access to all helpers defined within `application_helper`. 
    include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url` 

    layout "notifications_mailer" 
end 

3) zmieniony config/initializers/devise.rb zawierać następujące fragmentu:

config.mailer = 'UserMailer' 

4) Dodano klasę UserMailerPreview do lib/mailer_previews o następującej treści:

class UserMailerPreview < ActionMailer::Preview 
    def confirmation_instructions 
    UserMailer.confirmation_instructions(User.first, {}) 
    end 

    def reset_password_instructions 
    UserMailer.reset_password_instructions(User.first, {}) 
    end 

    def unlock_instructions 
    UserMailer.unlock_instructions(User.first, {}) 
    end 
end 

Tak daleko, tak dobrze. Wygląda na to, że wszystko zrobiłem dobrze. Ale staram się zobaczyć podgląd na e-mail w/szyny/koperty/user_mailer/droga confirmation_instructions confirmation_instructions i pojawia się następujący błąd:

undefined method `confirmation_url' for #<#<Class:0x007fa02ab808e0>:0x007fa030fb7e80> 

kod dla mojego confirmation_url.html.erb szablon wygląda tak:

<%= t("notifications.texts.greeting") + @user.display_name %>, 

<p>You can confirm your account email through the link below:</p> 

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p> 

Co robię źle? Domyślam się, że jest coś złego w sposobie, w jaki nazywam metodę confirmation_url. Czy ktoś może mi tutaj pomóc?

+0

Gdzie nazywasz' potwierdzenie_url'? Czy możesz udostępnić odpowiedni kod w miejscu, w którym pojawia się ten błąd. –

+0

ah, w widoku. Zaktualizowano wpis – rodrigoalves

+0

Podążałem za sugestiami @ steel i działałem. Musiałem też zrestartować serwer, aby zmiany zaczęły obowiązywać. – Besi

Odpowiedz

5

Znalazłem to pytanie, ponieważ próbowałem dowiedzieć się, jak samemu wyświetlić podgląd e-maili od Devise. Skopiowałem twój kod prawie dokładnie i to działa dobrze dla mnie.

Jedyną rzeczą, jaką zrobiłem inaczej było usunąć wiersz layout "notifications_mailer" z UserMailer - kiedy włączyła ją dostałem komunikat o błędzie Missing template layouts/notifications_mailer. Co się stanie, jeśli go usuniesz?

Linia Devise::Controllers::UrlHelpers zdecydowanie zawiera metodę confirmation_url (widać to na siebie poprzez otwarcie konsoli Rails i działa include Devise::Controllers::UrlHelpers następnie confirmation_url, więc podejrzewam, że problemem jest to, że zapowiedzi nie są renderowane przez UserMailer w ogóle. nie jestem pewien dlaczego, ale linia layout "notifications_mailer" może być winowajcą.

Czy masz klasę o nazwie NotificationsMailer? Czy w tym Devise::Controllers::UrlHelpers tam w rozwiązaniu problemu?

31

dla tych, którzy chcą obejrzeć Opracować maile bez użycia niestandardowy program pocztowy s, (ale wciąż niestandardowe maile) jest to, co zrobiłem (działa w Rails> = 4.1):

  1. Skonfiguruj swoją aplikację do poczty podglądu.

  2. Ustaw klasę Devise Mailer Preview

    # mailer/previews/devise_mailer_preview.rb 
    class Devise::MailerPreview < ActionMailer::Preview 
    
        def confirmation_instructions 
        Devise::Mailer.confirmation_instructions(User.first, "faketoken") 
        end 
    
        def reset_password_instructions 
        Devise::Mailer.reset_password_instructions(User.first, "faketoken") 
        end 
    
        ... 
    
    end 
    
  3. zrestartować serwer

+0

Dzięki za odpowiedź. Zadziałało. Nie wiem jeszcze jak przetestować reset_password_instructions, ponieważ nie wiem, które argumenty przekazać. PS: Musisz wcięcie o jeden poziom, ponieważ kod znajduje się na liście. – Besi

+0

@Besi, dzięki za pomoc dotyczącą formatu. Aby przetestować resetowanie hasła, wystarczy przekazać mu użytkownika i ciąg znaków, taki jak ten: Devise :: Mailer.reset_password_instructions (User.first, "faketoken") – steel

+1

Nie określono, działa z szyn 4.1 – Ben

5

dostaniesz metody niezdefiniowanej dla opracować pomocników URL, gdy użytkownik zapomniał zawierać niezbędne moduły opracować w twoim modelu. na przykład Jeśli model jest User i chcesz confirmation_url, należy upewnić się, że moduł :confirmable wliczone jest:

devise <...snipped...>, :confirmable 
2

pomocą szyn 5 i znalazł składnię nieco inny od @ doskonałą odpowiedź Steel, z zastosowaniem podwójnie „: : "Różnica:

# Preview all emails at http://localhost:3000/rails/mailers/devise_mailer 
class DeviseMailerPreview < ActionMailer::Preview 

    def reset_password_instructions 
     Devise::Mailer.reset_password_instructions(User.first, "faketoken") 
    end 
end