【问题标题】:Is there an alternative to using Rails.env?有没有使用 Rails.env 的替代方法?
【发布时间】:2017-07-14 17:40:57
【问题描述】:
在我的控制器中,我有一个创建电子邮件并将其发送出去的部分,但我希望该功能仅在生产中可用。
email = PortalEmail.new(params[:portal][:email]) if Rails.env.production? && PortalEmail.app_or_site?(@object)
有没有更好的方法来做到这一点?也许在配置/环境文件夹中?
任何想法将不胜感激。
【问题讨论】:
标签:
ruby-on-rails
ruby
configuration
【解决方案1】:
在开发模式下运行时,您可以使用letter_opener 在浏览器中预览电子邮件。
只要添加到开发组下,就可以这样配置:
# config/environments/development.rb
config.action_mailer.delivery_method = :letter_opener
而且你不再需要那个条件了。
【解决方案2】:
我更喜欢像这样使用在 application.rb 中设置的标志:
# application.rb
config.can_send_mail = false
# production.rb
config.can_send_mail = true
然后使用
email = PortalEmail.new(params[:portal][:email]) if Rails.application.config.can_send_mail && PortalEmail.app_or_site?(@object)
为了避免在我的应用程序中乱扔对环境的引用。当您以后添加一个也需要发送电子邮件的新环境(如暂存环境)时,这会更容易。
【解决方案3】:
测试Rails.env.production? 是仅在生产环境中有条件地执行代码的最佳、最简洁的方法。
也就是说,您应该从控制器中删除条件代码,而是配置一个假 MTA 以在生产环境之外接收电子邮件。例如,MailCatcher 提供了一个虚假的 MTA,它将“捕获”您的开发环境发送的任何邮件并保留它,以便您在其基于 Web 的 UI 中进行检查。
通常最好将您的应用配置为在开发中使用虚假依赖项,而不是使用条件环境检查乱扔代码。