Come si visualizzano in anteprima le e-mail in Rails?


116

Questa potrebbe essere una domanda stupida ma quando metto insieme un'e-mail HTML in Rails, esiste un modo integrato particolarmente semplice per visualizzare in anteprima il modello nel browser o devo scrivere una sorta di controller personalizzato che lo tenga in come la sua vista?


2
Apparentemente non ci sono domande stupide: D
knagode

Risposte:


134

Action Mailer ora ha un modo integrato di visualizzare in anteprima le email in Rails 4.1 . Ad esempio, controlla questo:

# located in test/mailers/previews/notifier_mailer_preview.rb

class NotifierPreview < ActionMailer::Preview
  # Accessible from http://localhost:3000/rails/mailers/notifier/welcome
  def welcome
    Notifier.welcome(User.first)
  end
end

5
@andres Abbastanza sicuro che sia in base alla progettazione: non vuoi che gli utenti visualizzino in anteprima la tua posta sui server di produzione, è pensata solo per lo sviluppo locale.
mpowered

1
@mpowered E se volevo che gli utenti fossero in grado di visualizzare in anteprima / modificare i messaggi che stanno per inviare? (Es: un manager rifiuta una richiesta utente e viene inviata un'e-mail per avvertire il richiedente)
Cyril Duchon-Doris

2
@CyrilDD Dovresti costruire qualcosa del genere da solo, non penso che questo sarebbe lo strumento per quel lavoro.
benjaminjosephw

1
L'anteprima è disponibile in localhost: 3000 / rails / mailers / notifier / welcome , e un elenco di questi in localhost: 3000 / rails / mailers .
zires

8
Se stai usando Rspec, le tue anteprime vanno inspec/mailers/previews
Drew Stephens

73

La risposta di Daniel è un buon inizio, ma se i tuoi modelli di email contengono dati dinamici, non funzionerà. Ad esempio, supponi che la tua email sia una ricevuta dell'ordine e al suo interno stampi, @order.total_priceutilizzando il metodo precedente, il file@order variabile sarà nulla.

Ecco una piccola ricetta che uso:

Innanzitutto, poiché questa funzionalità di anteprima della posta elettronica è sicuramente solo per uso interno, ho impostato alcune route generiche nello spazio dei nomi dell'amministratore:

#routes.rb

MySite::Application.routes.draw do
  namespace :admin do
    match 'mailer(/:action(/:id(.:format)))' => 'mailer#:action'
  end
end

Successivamente, creo il controller. In questo controller, creo un metodo per modello di email. Poiché la maggior parte delle e-mail contiene dati dinamici, è necessario popolare tutte le variabili membro previste dal modello.

Questo potrebbe essere fatto con i dispositivi, ma in genere preferisco prendere solo alcuni dati reali pseudo-casuali. Ricorda: questo NON è un test unitario, è puramente un aiuto allo sviluppo. Non è necessario che produca lo stesso risultato ogni volta, anzi, probabilmente è meglio se non lo fa!

#app/controllers/admin/mailer_controller.rb
class Admin::MailerController < Admin::ApplicationController

  def preview_welcome()
    @user = User.last
    render :file => 'mailer/welcome.html.erb', :layout => 'mailer'
  end

end

Nota che quando rendiamo il template, usiamo layout=>:mailer. Questo incorpora il corpo della tua email all'interno del layout email HTML che hai creato invece che all'interno del layout tipico dell'applicazione web (ad esempio application.html.erb).

E questo è praticamente tutto. Ora posso visitare http://example.com/admin/mailer/preview_welcome per visualizzare in anteprima la modifica al mio modello di email di benvenuto.


Questo era in effetti esattamente l'approccio che avevo adottato e che ho appena codificato quando ho iniziato a leggere la tua risposta - grazie :)
Peter Nixey

Bella risposta! Esattamente quello di cui avevo bisogno!
Kulgar

Questa è una ricetta gustosa! Grazie per la magnifica risposta!
Rob Cooper

Questa è una risposta fantastica! Grazie!
OzBandit

5
Il percorso dovrebbe essere get 'mailer...ora invece di match.
Patrick Berkeley

18

37Signals ha anche il proprio gioiello di test della posta chiamato mail_view . È davvero fantastico.


Nessun problema. In che modo hai finito per usare?
Marc

Bac quando ho pubblicato questo ho risolto il problema con un controller personalizzato che ho scritto da solo ma lo colpirò di nuovo presto, quindi lo sperimenterò
Peter Nixey

16

La configurazione più semplice che ho visto è MailCatcher . L'installazione ha richiesto 2 minuti e funziona per i nuovi mailer fuori dalla scatola.


Questo è davvero fantastico. L'installazione è molto veloce e funziona per tutti i mailer! Ottimo suggerimento!
rettifica


5

Recentemente ho scritto una gemma chiamata Maily per visualizzare in anteprima, modificare (file modello) e consegnare le email dell'applicazione tramite un browser. Fornisce inoltre un modo semplice per agganciare i dati, un sistema di autorizzazione flessibile e un'interfaccia utente minimalista.

Ho pianificato di aggiungere nuove funzionalità nel prossimo futuro, come:

  • Ganci multipli per e-mail
  • Parametrizza le email tramite l'interfaccia utente (argomenti del metodo mailer)
  • Gioca con le chiavi di traduzione (elenco, evidenziazione, ...)

Spero possa aiutarti.



4

railsgenera un'anteprima della posta se utilizzi rails g mailer CustomMailer. Otterrai un file CustomMailerPreviewall'interno della spec/mailers/previewscartella.

Qui puoi scrivere il tuo metodo che chiamerà il mailer e genererà un'anteprima.

Per ex -

class CustomMailerPreview < ActionMailer::Preview
  def contact_us_mail_preview
    CustomMailer.my_mail(user: User.first)
  end
end

Visualizza l'anteprima di tutte le email su http: // localhost: 3000 / rails / mailers / custom_mailer


Per la mia app con rspec ho aggiunto config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Mauro

3

Rails Email Preview ci aiuta a visualizzare rapidamente l'email nel browser web in modalità di sviluppo.

1) Aggiungi “gem ‘rails_email_preview’, ‘~> 0.2.29’ “al file gem e installa il bundle.

2) Corri “rails g rails_email_preview:install” questo crea l'inizializzatore nella cartella di configurazione e aggiungi percorsi.

3) Esegui “rails g rails_email_preview:update_previews”questa cartella crates mailer_previews nella directory dell'app.

Generator aggiungerà uno stub a ciascuna delle tue e-mail, quindi popolerai lo stub con dati fittizi.

Ex:

class UserMailerPreview
def invitation
UserMailer.invitation mock_user(‘Alice’), mock_user(‘Bob’)
end
def welcome
UserMailer.welcome mock_user
end
private
def mock_user(name = Bill Gates’)
fake_id User.new(name: name, email: user#{rand 100}@test.com”)
end
def fake_id(obj)
obj.define_singleton_method(:id) { 123 + rand(100) }
obj
end
end

4) I parametri nella query di ricerca saranno disponibili come variabile di istanza per l'anteprima della classe. Es: se abbiamo un URL come “/emails/user_mailer_preview-welcome?user_id=1” @user_idè definito nel metodo di benvenuto, UserMailerPreviewci aiuta a inviare la posta a un utente specifico.

class UserMailerPreview
def welcome
user = @user_id ? User.find(@user_id) : mock_user
UserMailer.welcome(user)
end
end

5) Per accedere a URL REP in questo modo

rails_email_preview.rep_root_url
rails_email_preview.rep_emails_url
rails_email_preview.rep_email_url(‘user_mailer-welcome’)

6) Possiamo inviare e-mail tramite REP, questo utilizzerà le impostazioni del mailer dell'ambiente. Rimuovere il commento da questa riga nell'inizializzatore per disabilitare l'invio di posta nell'ambiente di prova.

config.enable_send_email = false

Fonte: RailsCarma Blog : Previewing Emails in Rails Applications With the Mail_View Gem


3

Sono sorpreso che nessuno abbia menzionato letter_opener . È un gioiello che visualizzerà e aprirà le e-mail come una pagina del browser ogni volta che un'e-mail viene consegnata in dev.


1
letter_opener è una gemma interessante ed è un must. Ma a volte la posta parte da eventi speciali che si desidera evitare di riprodurre per controllare puramente l'html / css della posta.
Mauro

2

Non è possibile visualizzarne l'anteprima direttamente dal Mailer. Ma come hai scritto, puoi scrivere un controller, che assomiglia a questo.

class EmailPreviewsControllers < ActionController::Base
  def show
    render "#{params[:mailer]}_mailer/#{params[:method]}"
  end
end

Ma penso che non sia il modo migliore per testare le e-mail, se hanno un aspetto corretto.


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'incorporerà il corpo dell'email all'interno del layout dell'email HTML che hai creato per la tua app.
dexter

Grazie per questo - Non voglio ricontrollare la compatibilità del browser, lo tratterò separatamente, voglio solo sputare velocemente la cosa e vedere come appare - Penso che il tuo approccio funzioni bene per questo
Peter Nixey

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.