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.