【问题标题】: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 中进行检查。

      通常最好将您的应用配置为在开发中使用虚假依赖项,而不是使用条件环境检查乱扔代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 2015-10-18
        • 2015-11-18
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        相关资源
        最近更新 更多