根据Rails中的环境变量更改行为的最佳方法

时间:2016-11-30 11:25:01

标签: ruby-on-rails ruby

我有时会遇到根据环境不同处理流量的情况。 (例如,禁用某些功能)

例如。 如果您使用生产,则可以在流程成功时发送电子邮件。 但对于 test 开发环境,我们只需将其禁用即可。

现在,我只是放if-clause

  ActiveRecord::Base.transaction do
    itemable = create_invoiceitemable(each_line)
    next unless itemable.present?

    create_invoiceitem(invoice, itemable, each_line[:id])
  end
  ReceiptMailer.receipt(invoie[:uuid]).deliver_later if RAILS_ENV[:production]

有什么想法可以更好地处理这个问题?

2 个答案:

答案 0 :(得分:1)

回答一个确切的问题是不可能的,因为它是基于意见的,但你可能会发现这些方法有用的方法:

<强>配置/初始化/ stubs.rb

ReceiptMailer.prepend(Module.new do
  def receipt(*args)
    Logger.info "ReceiptMailer#receipt called with #{args.inspect}"
    Hashie::Mash.new { deliver_later: nil } # to allow call
  end
end) unless RAILS_ENV[:production]

答案 1 :(得分:0)

而不是依赖于环境的名称来检查是否应该激活某些内容..为什么不使用环境变量,您可以在环境特定文件中设置其值并检查其值。

这种方式,例如,如果您在Heroku上部署您的应用程序您可以启用或禁用此功能,而无需每次都接触代码或重新部署,因为这些都可以从界面或命令行获得。

我个人认为这是一个很好的方法。也可能有其他好方法。

你可以使用像dotenv这样的不同宝石来实现这一目标。那里可能还有其他宝石。

希望这会有所帮助:)