Rails ActionMailer 生产预览

问题描述 投票:0回答:5

我使用 Rails 4.1.1 和 ActionMailer::Preview 来预览电子邮件。在开发环境中一切都运行良好。

但在生产环境中预览路由无法访问。我将预览存储在 test/mailers/previews/

是否可以将其投入生产?

ruby-on-rails email ruby-on-rails-4 actionmailer
5个回答
16
投票

除此之外:

config.action_mailer.show_previews = true

您还需要设置

config.consider_all_requests_local = true

在您的环境中可以访问预览路线。这还有其他影响(请参阅https://stackoverflow.com/a/373135/1599045),因此您可能不想在生产中启用此功能。但是,如果您的自定义环境不是

development
,那么将这两者结合起来应该可以正常工作。

编辑添加:

最初的问题是针对 Rails 4.1.1,它没有

config.action_mailer.show_previews
可用。要让 ActionMailer 预览在 Rails 4.1.1 中的非开发环境中工作,您需要首先向
config/routes.rb
添加一些路由(在本例中,我的环境名为
custom
):

if Rails.env.custom?
  get '/rails/mailers'         => "rails/mailers#index"
  get '/rails/mailers/*path'   => "rails/mailers#preview"
end

然后您需要自动加载环境配置文件中所需的库(在我的例子中,

config/environments/custom.rb
):

config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil
config.autoload_paths += [config.action_mailer.preview_path]

这似乎执行与

config.action_mailer.show_previews
相同的任务。

与 4.2 一样,您仍然需要根据您的自定义环境是在本地还是在服务器上使用,如上所述调整本地请求配置。


15
投票

在不打开大安全漏洞的情况下做到这一点:

生产.rb

MyApp::Application.configure do
  config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/spec/mailer_previews" : nil
  config.autoload_paths += [config.action_mailer.preview_path]

  routes.append do
    get '/rails/mailers'         => "rails/mailers#index"
    get '/rails/mailers/*path'   => "rails/mailers#preview"
  end
end

class ::Rails::MailersController
  before_filter :authenticate_admin!
  def local_request?
    true
  end
  private
  def authenticate_admin!
    ...
  end
end

3
投票

可以通过

config.action_mailer.show_previews = true
在生产中启用预览,正如最佳答案所述。

我只是想添加如何在您自己的管理区域内的 iframe 中渲染预览,例如。在 活动管理 (Rails 5.1)

而且我还发现,编写自己的电子邮件预览管理并不难,并且根本不使用 Rails 标准预览。然后,您可以添加自己的功能,例如更改预览参数或发送按钮以在手机中查看此电子邮件。


2
投票

从 Rails 4.2 开始,您可以在 production.rb(或其他自定义环境)中使用该标志:

config.action_mailer.show_previews = true

我在 Rails 4.1 中没有找到类似的东西。

更新
例如,如果使用 Rspec,则需要添加路径:

config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews"

默认路径是“#{Rails.root}/test/mailers/previews”。

并且无需触摸 config.consider_all_requests_local


2
投票

这是我为 Rails 5.2 所做的:

production.rb

  config.action_mailer.show_previews = true
  config.action_mailer.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/spec/mailers/previews" : nil

  class ::Rails::MailersController
    include ::ApplicationController::Authorization
    before_action :require_admin
  end

假设您的

ApplicationController::Authorization
模块具有
require_admin
的代码。我更喜欢这种方法,而不是重写我的授权代码。记住在前面包含
::
是很棘手的,因为说
include ApplicationController::...
会在
Rails::MailersController
命名空间中查找。

© www.soinside.com 2019 - 2024. All rights reserved.