ruby-on-rails 生产环境中的Rails Mailer预览

kognpnkq  于 12个月前  发布在  Ruby
关注(0)|答案(5)|浏览(162)

我正在使用rails 4.1.1和mailer::preview预览电子邮件。在开发环境中,一切都工作得很好。
但是在生产环境中预览路由是不可访问的。我将预览存储在test/mailers/previews/
是否可以将其用于生产?

sshcrbum

sshcrbum1#

除此之外:

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。要让Rails 4.1.1的非开发环境中的Mailer预览版工作,您需要首先向config/routes.rb添加一些路由(在本例中,我的环境名为custom):

if Rails.env.custom?
  get '/rails/mailers'               => "rails/mailers#index"
  get 'rails/mailers/download/*path' => "rails/mailers#download"
  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一样,您仍然需要根据您的自定义环境是在本地使用还是在服务器上使用来调整本地请求配置。

holgip5t

holgip5t2#

要做到这一点,而不打开一个大的安全漏洞:

production.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

字符串

anauzrmj

anauzrmj3#

正如最佳答案所说,可以通过config.action_mailer.show_previews = true在生产环境中启用预览。
我只是想补充一下如何在你自己的管理区域内的iframe中呈现预览,例如在active admin(Rails 5.1)中。
而且我发现write your own email previews administration并不难,根本不用rails标准预览,你可以添加自己的功能,比如改变预览参数或者点击发送按钮在手机上看到这封邮件。

laximzn5

laximzn54#

从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

disho6za

disho6za5#

下面是我在Rails 5.2中所做的:
第一个月

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命名空间内查找。

相关问题