Skip to content

Instantly share code, notes, and snippets.

@scmx
Last active August 27, 2022 23:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scmx/8761d6a12f63d918b33e to your computer and use it in GitHub Desktop.
Save scmx/8761d6a12f63d918b33e to your computer and use it in GitHub Desktop.
letter opener Super simple alternative #ruby #rails #development #staging #letter_opener #delivery_method

letter_opener_web

# app/controllers/emails_controller.rb
# Could not get gem letter_opener_web to work as intended,
# This is a simple alternative that uses delivery_method :test
class EmailsController < ActionController::Base
  layout nil

  def index
    @deliveries = ActionMailer::Base.deliveries.reverse
  end
end
# config/environments/staging.rb
config.action_mailer.delivery_method = :test
<!-- app/views/emails/index.html.erb -->
<div style="position: fixed; width: 200px; height: 100%">
  <% @deliveries.each_with_index do |delivery, index| %>
    <a href="#<%= index %>"><%= delivery.subject.to_s %></a>
    <br/>
  <% end %>
</div>

<div style="margin-left: 200px">
  <% @deliveries.each_with_index do |delivery, index| %>
    <article id="<%= index %>">
      <div>From: <%= delivery.from.join(", ") %></div>
      <div>Subject: <%= delivery.subject.to_s %></div>
      <div>Date: <%= delivery.date %></div>
      <div>To: <%= delivery.to.join(", ") %></div>
      <pre><%= delivery.body.to_s.html_safe %></pre>
    </article>
    <hr/>
  <% end %>

  <% if @deliveries.empty? %>
    No mails have been sent since last start of the app
  <% end %>
</div>
# config/routes.rb
if Rails.env.development? || Rails.env.staging?
  resources :emails, path: "/letter_opener"
end

Or if you prefer to use slim for templates

/ app/views/emails/index.html.slim
div style="position: fixed; width: 200px; height: 100%"
  - @deliveries.each_with_index do |delivery, index|
    a href="##{index}" = delivery.subject.to_s
    br

div style="margin-left: 200px"
  - @deliveries.each_with_index do |delivery, index|
    article id=index
      div From: #{delivery.from.join(", ")}
      div Subject: #{delivery.subject.to_s}
      div Date: #{delivery.date}
      div To: #{delivery.to.join(", ")}
      pre = delivery.body.to_s.html_safe
    hr

  - if @deliveries.empty?
    | No mails have been sent since last start of the app
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment