2016-11-30 44 views
1

我有時會面臨這種情況,根據環境的不同,可能會更好地處理流程。 (例如,禁用某些功能)根據Rails中的環境變量更改行爲的最佳方法

例如, 如果您在生產,您可以發送電子郵件,如果過程成功。 但是對於測試開發環境我們只是簡單地禁用它。

現在,我只是把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] 

有更好的方法來處理這個問題的任何想法?

+0

我建議使用專用的方法進行這樣的檢查:'if Rails.production?'。您將獲得更好的可維護性。 –

+0

對於電子郵件發送,我通常使用這個gem https://github.com/ryanb/letter_opener,它將在瀏覽器中直接打開電子郵件,而不是在開發過程中發送。 – tegon

回答

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] 
+0

感謝您的答案。這將是'deliver_now'的答案,但對於'deliver_later'它將作業排入redis。 – Tosh

0

而不是依賴環境的名稱來檢查是否應該激活或不激活..爲什麼不使用環境變量?您可以在環境特定文件中設置其值,並檢查其值。

這種方式,如果您例如在Heroku上部署您的應用程序您可以啓用或禁用此功能,而無需觸摸代碼或每次重新部署,因爲這些都可以從界面或命令行獲得。

我個人認爲這是一個很好的方法。也可能有其他好方法。

你可以使用不同的寶石像dotenv來完成這一點。那裏可能還有其他的寶石。

希望這會有所幫助:)