Làm cách nào để xem trước email trong Rails?


116

Đây có thể là một câu hỏi ngớ ngẩn nhưng khi tôi kết hợp một email HTML trong Rails, liệu có một cách tích hợp đặc biệt dễ dàng để xem trước mẫu trong trình duyệt hay tôi có cần viết một số loại trình điều khiển tùy chỉnh để kéo nó không theo quan điểm của nó?


2
Rõ ràng có những câu hỏi không câm: D
knagode

Câu trả lời:


133

Action Mailer hiện đã tích hợp sẵn một cách để xem trước email trong Rails 4.1 . Ví dụ, hãy kiểm tra điều này:

# 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 Khá chắc chắn đó là do thiết kế - bạn không muốn người dùng xem trước thư của mình trên máy chủ sản xuất, nó chỉ dành cho phát triển cục bộ.
mpowered

1
@mpowered Và điều gì sẽ xảy ra nếu tôi muốn người dùng có thể xem trước / sửa đổi thư mà họ sắp gửi? (Ví dụ: người quản lý từ chối đơn đăng ký của người dùng và một email được gửi để cảnh báo người nộp đơn)
Cyril Duchon-Doris 20/02

2
@CyrilDD Bạn phải tự mình xây dựng một thứ như vậy, tôi không nghĩ đây sẽ là công cụ cho công việc đó.
benjaminjosephw

1
Bản xem trước có sẵn trong localhost: 3000 / rails / mailers / notifier / welcome và danh sách chúng trong localhost: 3000 / rails / mailers .
zires

8
Nếu bạn đang sử dụng Rspec, các bản xem trước của bạn sẽ có sẵnspec/mailers/previews
Drew Stephens

73

Câu trả lời của Daniel là một khởi đầu tốt, nhưng nếu các mẫu email của bạn chứa bất kỳ dữ liệu động nào, nó sẽ không hoạt động. Ví dụ: giả sử email của bạn là một biên lai đơn đặt hàng và bên trong nó bạn in ra @order.total_price- sử dụng phương pháp trước đó, @orderbiến sẽ là 0.

Đây là một công thức nhỏ tôi sử dụng:

Đầu tiên, vì chức năng xem trước email này chắc chắn chỉ dành cho mục đích sử dụng nội bộ, tôi thiết lập một số tuyến chung trong không gian tên quản trị viên:

#routes.rb

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

Tiếp theo, tôi tạo bộ điều khiển. Trong bộ điều khiển này, tôi tạo một phương thức cho mỗi mẫu email. Vì hầu hết các email đều chứa dữ liệu động, nên chúng tôi cần điền bất kỳ biến thành viên nào mà mẫu mong đợi.

Điều này có thể được thực hiện với đồ đạc, nhưng tôi thường thích chỉ lấy một số dữ liệu thực giả ngẫu nhiên. Hãy nhớ rằng - đây KHÔNG phải là một bài kiểm tra đơn vị - đây hoàn toàn là một hỗ trợ phát triển. Nó không cần phải tạo ra cùng một kết quả mỗi lần - trên thực tế - có lẽ tốt hơn nếu nó không!

#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

Lưu ý rằng khi chúng tôi kết xuất mẫu, chúng tôi sử dụng layout=>:mailer. Thao tác này sẽ nhúng nội dung email của bạn vào bên trong bố cục email HTML mà bạn đã tạo thay vì bên trong bố cục ứng dụng web điển hình của bạn (ví dụ application.html.erb:).

Và đó là khá nhiều. Giờ đây, tôi có thể truy cập http://example.com/admin/mailer/preview_welcome để xem trước thay đổi đối với mẫu email chào mừng của mình.


Đây là trên thực tế chính xác phương pháp tôi đã thực hiện và chỉ được mã hóa khi tôi bắt đầu đọc câu trả lời của bạn - cảm ơn bạn :)
Peter Nixey

Câu trả lời chính xác! Chính xác những gì tôi cần!
Kulgar

Bây giờ đó là một công thức ngon! Cảm ơn vì câu trả lời tuyệt vời!
Rob Cooper

Đây là một câu trả lời tuyệt vời! Cảm ơn bạn!
OzBandit

5
Tuyến đường nên là get 'mailer...bây giờ thay vì match.
Patrick Berkeley

18

37Signals cũng có gem kiểm tra thư của riêng họ được gọi là mail_view . Nó khá tuyệt vời.


Không vấn đề gì. Bạn đã sử dụng cách nào?
Marc

Bắc khi tôi gửi tôi này đã giải quyết được vấn đề với một bộ điều khiển tùy chỉnh tôi đã viết bản thân mình nhưng tôi sẽ đánh nó một lần nữa sớm như vậy sẽ được thử nghiệm với điều này
Peter Nixey

16

Thiết lập dễ nhất mà tôi đã thấy là MailCatcher . Quá trình thiết lập mất 2 phút và nó hoạt động với những người gửi thư mới.


Điều này thực sự là tuyệt vời. Thiết lập rất nhanh và hoạt động cho tất cả các bưu phẩm! Mẹo hay!
rept


5

Gần đây tôi đã viết một viên ngọc có tên Maily để xem trước, chỉnh sửa (tệp mẫu) và gửi email ứng dụng qua trình duyệt. Nó cũng cung cấp một cách thân thiện để kết nối dữ liệu, hệ thống ủy quyền linh hoạt và giao diện người dùng tối giản.

Tôi đã lên kế hoạch thêm các tính năng mới trong tương lai gần, như:

  • Nhiều móc cho mỗi email
  • Tham số email qua giao diện người dùng (đối số của phương thức bưu phẩm)
  • Chơi với các phím dịch (danh sách, đánh dấu, ...)

Tôi hy vọng nó có thể giúp bạn.


4

Bạn có thể sử dụng Rails Email Preview

ảnh chụp màn hình rails-email-xem trước

REP là một công cụ rails để xem trước và thử nghiệm gửi email, với hỗ trợ I18n, tích hợp trình gửi thư trước dễ dàng và chỉnh sửa CMS tùy chọn với thoải mái_mexican_sofa .


Có bất kỳ mẫu nào về cách thực sự tích hợp giữa REP và CMS không?
danieldekay

Tôi không biết về bất kỳ ứng dụng demo, nhưng có một toàn diện bài viết trong wiki
glebm

4

railstạo bản xem trước thư nếu bạn sử dụng rails g mailer CustomMailer. Bạn sẽ nhận được một tệp CustomMailerPreviewbên trong spec/mailers/previewsthư mục.

Tại đây bạn có thể viết phương thức của mình sẽ gọi bưu phẩm và nó sẽ tạo bản xem trước.

Đối với người yêu cũ -

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

Xem trước tất cả các email tại http: // localhost: 3000 / rails / mailers / custom_mailer


Đối với ứng dụng của tôi với rspec tôi thêm config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"
Mauro

3

Rails Email Preview giúp chúng ta xem nhanh email trong trình duyệt web ở chế độ phát triển.

1) Thêm “gem ‘rails_email_preview’, ‘~> 0.2.29’ “vào tệp gem và cài đặt gói.

2) Chạy “rails g rails_email_preview:install”điều này tạo trình khởi tạo trong thư mục cấu hình và thêm các tuyến đường.

3) Chạy “rails g rails_email_preview:update_previews”thư mục mailer_previews thùng này trong thư mục ứng dụng.

Generator sẽ thêm phần sơ khai vào mỗi email của bạn, sau đó bạn điền phần sơ khai bằng dữ liệu giả.

Ví dụ:

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) Các tham số trong truy vấn tìm kiếm sẽ có sẵn dưới dạng một biến thể hiện cho lớp xem trước. Ví dụ: nếu chúng ta có một URL giống như “/emails/user_mailer_preview-welcome?user_id=1” @user_idđược định nghĩa trong phương thức chào mừng, UserMailerPreviewnó sẽ giúp chúng ta gửi thư đến người dùng cụ thể.

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

5) Để truy cập url REP như thế này

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

6) Chúng tôi có thể gửi email qua REP, điều này sẽ sử dụng cài đặt môi trường phong bì. Bỏ ghi chú dòng này trong trình khởi tạo để tắt tính năng gửi thư trong môi trường thử nghiệm.

config.enable_send_email = false

Nguồn: RailsCarma Blog: Xem trước email trong ứng dụng Rails với Gem Mail_View


3

Tôi ngạc nhiên là không có ai được đề cập đến letter_opener . Đó là một viên ngọc quý sẽ hiển thị và mở email dưới dạng trang trình duyệt bất cứ khi nào email được gửi trong nhà phát triển.


1
letter_opener là một viên ngọc tuyệt vời và nó phải có. Nhưng đôi khi thư bắt đầu từ các sự kiện đặc biệt mà bạn muốn tránh chơi để kiểm tra hoàn toàn html / css của thư.
Mauro

2

Không có cách nào để xem trước trực tiếp từ Mailer. Nhưng như bạn đã viết, bạn có thể viết một bộ điều khiển, trông giống như thế này.

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

Nhưng tôi nghĩ, đó không phải là cách tốt nhất để kiểm tra email, nếu chúng nhìn đúng.


3
render "#{params[:mailer]}_mailer/#{params[:method]}", :layout => 'mailer'sẽ nhúng nội dung email vào trong bố cục email HTML mà bạn đã tạo cho ứng dụng của mình.
dexter

Cảm ơn vì điều đó - Tôi không muốn kiểm tra lại khả năng tương thích của trình duyệt, tôi sẽ xử lý điều đó một cách riêng biệt, tôi chỉ đơn giản muốn nhanh chóng rút ra mọi thứ và xem nó trông như thế nào - Tôi nghĩ cách tiếp cận của bạn hoạt động tốt cho điều đó
Peter Nixey

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.