Як переглянути попередні листи в Rails?


116

Це може бути глумим питанням, але коли я збираю HTML-адресу електронної пошти в Rails, чи є особливо простий вбудований спосіб попереднього перегляду шаблону в браузері чи мені потрібно написати якийсь спеціальний контролер, який його тягне як його погляд?


2
Мабуть, немає ніяких запитань: D
knagode

Відповіді:


133

Тепер Action Mailer має вбудований спосіб попереднього перегляду електронних листів у Rails 4.1 . Наприклад, перевірте це:

# 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 Досить впевнений, що це дизайн - ви не хочете, щоб користувачі переглядали вашу пошту на виробничих серверах, вона призначена лише для місцевого розвитку.
надійшов

1
@mpowered І що робити, якщо я дійсно хочу, щоб користувачі могли переглядати / змінювати пошту, яку вони збираються надсилати? (Наприклад: менеджер відмовляється від користувацької програми, і електронний лист надсилається для попередження заявника)
Кирило Дюшон-Доріс

2
@CyrilDD Вам би довелося будувати щось подібне самостійно, я не думаю, що це буде інструментом для цієї роботи.
benjaminjosephw

1
Попередній перегляд доступний у localhost: 3000 / rails / mailer / notifier / welcome , та їх перелік у localhost: 3000 / rails / mailer .
zires

8
Якщо ви використовуєте Rspec, ваш попередній перегляд увійшовspec/mailers/previews
Дрю Стівенс

73

Деніела відповіді є початок гарне, але якщо ваші поштові шаблони містять динамічні дані, він не буде працювати. Скажімо, ваш електронний лист - це квитанція про замовлення, і всередині нього ви роздруковуєте @order.total_price- використовуючи попередній метод, @orderзмінна буде нульовою.

Ось невеликий рецепт, який я використовую:

По-перше, оскільки ця функція попереднього перегляду електронної пошти, безумовно, призначена лише для внутрішнього використання, я створив кілька загальних маршрутів у просторі імен адміністратора:

#routes.rb

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

Далі я створюю контролер. У цьому контролері я створюю один метод на шаблон електронної пошти. Оскільки більшість електронних листів містять динамічні дані, нам потрібно заповнити всі змінні учасника, які шаблон очікує.

Це можна зробити за допомогою світильників, але я, як правило, вважаю за краще просто захопити деякі псевдовипадкові реальні дані. Пам'ятайте - це НЕ єдиний тест - це суто допомога розвитку. Не потрібно давати однаковий результат кожен раз - насправді - це, мабуть, краще, якщо цього немає!

#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

Зауважте, що коли ми надаємо шаблон, ми використовуємо layout=>:mailer. Це вбудовує частину вашої електронної пошти у створений вами макет HTML-адреси електронної пошти замість типового макета веб-додатків (наприклад application.html.erb).

І це майже все. Тепер я можу завітати на http://example.com/admin/mailer/preview_welcome, щоб переглянути зміни до свого вітального шаблону електронної пошти.


Насправді саме такий підхід я застосував і лише зашифрував, коли я почав читати вашу відповідь - дякую :)
Пітер Ніксей

Чудова відповідь! Саме те, що мені було потрібно!
Kulgar

Тепер це смачний рецепт! Дякую за чудову відповідь!
Роб Купер

Це приголомшлива відповідь! Дякую!
OzBandit

5
Маршрут має бути get 'mailer...тепер замість match.
Патрік Берклі

18

37Signals також має власний дорогоцінний камінь для тестування пошти під назвою mail_view . Це досить фантастично.


Нема проблем. Яким способом ви в кінцевому підсумку користувалися?
Марк

Бак, коли опублікував це, я вирішив проблему з користувальницьким контролером, який я написав сам, але незабаром
вдару

16

Найпростіша установка, яку я бачив, - це MailCatcher . Установка зайняла 2 хвилини, і вона працює для нових електронних повідомлень поза коробкою.


Це справді чудово. Настройка дуже швидка і працює для всіх поштових повідомлень! Чудова порада!
реп.


5

Нещодавно я написав дорогоцінний камінь на ім'я Maily для попереднього перегляду, редагування (файл шаблону) та доставку електронної пошти програми через браузер. Він також забезпечує дружній спосіб підключення даних, гнучку систему авторизації та мінімалістичний інтерфейс користувача.

Я планував додати нові функції найближчим часом, як-от:

  • Кілька гачків на електронну пошту
  • Параметризувати електронні листи за допомогою інтерфейсу (аргументи методу пошти)
  • Грайте з клавішами перекладу (список, виділення, ...)

Я сподіваюся, що це може вам допомогти.


4

Ви можете використовувати попередній перегляд електронної пошти Rails

екрани попереднього перегляду rails-email

REP - це система рельсів для попереднього перегляду та тестування відправлених електронних листів із підтримкою I18n, легкою інтеграцією premailer та додатковим редагуванням CMS за допомогою зручного_mexican_sofa .


Чи є зразки, як насправді зробити інтеграцію між REP та CMS?
Даніельдекай

Я не знаю жодних демо-додатків, але у вікі
glebm

4

railsпри використанні створює попередній перегляд пошти rails g mailer CustomMailer. Ви отримаєте файл CustomMailerPreviewвсередині spec/mailers/previewsпапки.

Тут ви можете написати свій метод, який зателефонує на пошту, і він створить попередній перегляд.

Для колишнього -

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

Попередній перегляд усіх електронних листів за адресою http: // localhost: 3000 / rails / mailer / custom_mailer


Для свого додатка з rspec я додав config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Мауро

3

Попередній перегляд електронної пошти Rails допомагає нам швидко переглядати електронну пошту у веб-браузері в режимі розробки.

1) Додати “gem ‘rails_email_preview’, ‘~> 0.2.29’ “до файлу gem та встановити пакет.

2) Запустіть “rails g rails_email_preview:install”це, створюючи ініціалізатор у конфігураційній папці та додайте маршрути.

3) Запустіть “rails g rails_email_preview:update_previews”цю папку mailer_previews у каталозі додатків.

Генератор додасть заглушку до кожної вашої електронної пошти, після чого u заповнить заглушку з макетними даними.

Наприклад:

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) Параметри пошукового запиту будуть доступні у вигляді змінної примірника для класу попереднього перегляду. Наприклад: якщо у нас така URL-адреса “/emails/user_mailer_preview-welcome?user_id=1” @user_idвизначена в привітальному методі, UserMailerPreviewце допомагає нам надсилати пошту певному користувачеві.

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

5) Отримати доступ до таких URL-адрес REP

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

6) Ми можемо надсилати електронні листи через REP, для цього буде використано налаштування електронної пошти. Відключіть цей рядок у ініціалізаторі, щоб відключити відправлення пошти у тестовому середовищі.

config.enable_send_email = false

Джерело: Блог RailsCarma: попередній перегляд електронних листів у програмах Rails за допомогою Gem Mail_View


3

Я здивований, що ніхто не згадує буквеного відкриття . Це дорогоцінний камінь, який буде відображати та відкривати електронні листи як сторінку веб-переглядача щоразу, коли електронний лист надходить у програмі Dev.


1
letter_opener - це крутий дорогоцінний камінь, і це обов'язково. Але іноді пошта починається від спеціальних подій, які ви хочете уникнути відтворення, щоб перевірити чисто html / css пошти.
Мауро

2

Немає способу попереднього перегляду його безпосередньо з Mailer. Але як ви писали, ви можете написати контролер, який виглядає приблизно так.

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

Але я думаю, що це не найкращий спосіб перевірити електронні листи, якщо вони виглядають правильно.


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'вбудує тіло електронної пошти всередину HTML-макета електронної пошти, яку ви створили для своєї програми.
dexter

Дякую за це - я не хочу подвоювати перевірку сумісності браузера, я б ставлюсь до цього окремо, просто просто хочу виплюнути річ і подивитися, як вона виглядає - я думаю, що ваш підхід для цього добре працює
Пітер Нікс

1

Я віддаю перевагу дорогоцінний камінь mails_viewer . Цей самоцвіт є дуже корисним, оскільки він зберігає HTML-шаблон у папці tmp.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.