【发布时间】:2015-02-11 18:00:56
【问题描述】:
我正在使用 rails 4.1.1 和 ActionMailer::Preview 来预览电子邮件。在开发环境中,一切都运行良好。
但在生产环境中无法访问预览路线。我将预览存储在 test/mailers/previews/
是否可以将它们用于生产?
【问题讨论】:
标签: email ruby-on-rails-4 actionmailer
我正在使用 rails 4.1.1 和 ActionMailer::Preview 来预览电子邮件。在开发环境中,一切都运行良好。
但在生产环境中无法访问预览路线。我将预览存储在 test/mailers/previews/
是否可以将它们用于生产?
【问题讨论】:
标签: email ruby-on-rails-4 actionmailer
从 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
【讨论】:
config.consider_all_requests_local = true
config.consider_all_requests_local = true 是一个非常糟糕的主意——用户将看到内部堆栈跟踪和错误消息,而不是您的 404 或 500 页面。
除此之外:
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 的非开发环境中使用 ActionMailer 预览,您需要先向 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 一样,您仍然需要根据您的自定义环境是在本地使用还是在服务器上使用来调整上述本地请求配置。
【讨论】:
config.cache_classes = false 才能让它在 4.2.2 中工作,在任何其他版本中未经测试。
config.consider_all_requests_local,因为这会将错误消息转储到浏览器,就像您在开发模式下看到的一样。您绝对不想在世界上有普通用户的生产环境中执行此操作。请参阅此线程中的“在不打开大安全漏洞的情况下执行此操作”答案!
在不打开大的安全漏洞的情况下做到这一点:
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
【讨论】:
before_filter 并覆盖了::Rails::MailersController 类的local_request? 方法。但是MyApp::Application.configure 部分的更改似乎没有必要。似乎安全的方法是设置config.action_mailer.show_previews = true,然后使用您建议的底部。你能帮我了解一下路径和路线吗?
正如最佳答案所说,config.action_mailer.show_previews = true 可以在生产中启用预览。
我只想添加如何在您自己的管理区域内的 iframe 中呈现预览,例如。在active admin (Rails 5.1)
而且我还发现write your own email previews administration 并不难,而且根本不使用rails 标准预览。然后,您可以添加自己的功能,例如更改预览参数或发送按钮以在手机中查看此电子邮件。
【讨论】:
这是我为 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 命名空间内查找。
【讨论】: