Brad Urani
Brad Urani

Reputation: 1479

Passing params into MailView or ActionMailer::Preview in Ruby on Rails

Is it possible when using the MailView gem or Rails 4.1 mail previews to pass parameters into the MailView? I would love to be able to use query string parameters in the preview URLs and access them in the MailView to dynamically choose which record to show in the preview.

Upvotes: 3

Views: 1767

Answers (3)

Kenneth Kalmer
Kenneth Kalmer

Reputation: 341

Since Rails 5.2, mailer previews now have a params attr reader available to use inside your previews.

Injecting requests into your mailers is not ideal as it might lead to thread safety issues and also means your mailers won't work with ActiveJob & co

Upvotes: 0

Clay McIlrath
Clay McIlrath

Reputation: 612

Still a relevant question and still very few solutions to be found on the web (especially elegant ones). I hacked my way through this one today and came up with this solution and blog post on extending ActionMailer.

# config/initializers/mailer_injection.rb

# This allows `request` to be accessed from ActionMailer Previews
# And @request to be accessed from rendered view templates
# Easy to inject any other variables like current_user here as well

module MailerInjection
  def inject(hash)
    hash.keys.each do |key|
      define_method key.to_sym do
        eval " @#{key} = hash[key] "
      end
    end
  end
end

class ActionMailer::Preview
  extend MailerInjection
end

class ActionMailer::Base
  extend MailerInjection
end

class ActionController::Base
  before_filter :inject_request

  def inject_request
    ActionMailer::Preview.inject({ request: request })
    ActionMailer::Base.inject({ request: request })
  end
end

Upvotes: 2

Mike Szyndel
Mike Szyndel

Reputation: 10593

I stumbled upon the same issue and as far as I understand from reading the Rails code it's not possible to access request params from mailer preview.

Crucial is line 22 in Rails::PreviewsController (email is name of the mailer method)

@email = @preview.call(email)

Upvotes: 6

Related Questions