我正在寻找一种干净的方式来根据我们是否处于测试,开发,登台或生产环境中而采取不同的行为。
我的问题是一般的,但我最好的具体示例是发送通知。假设我的User模型对象中有一个名为notify
的函数def notify(message)
#send a notification to the user (differs depending on the environment)
end
在测试环境中,我想使用一个只将通知保存到文件的模拟对象。在登台和生产环境中,我想使用PushNotification对象,该对象实际上将API请求发送到第三方服务。我需要为每个环境使用不同的api密钥。
我在想我会在lib / notifiers创建一个文件夹并创建一个file_notifier.rb和一个push_notifier.rb。我不知道在哪里(什么文件)以及如何初始化正确的通知程序。有什么想法吗?
谢谢!
答案 0 :(得分:2)
对于初学者来说,我会变得有点蠢 - 你没有功能,而是方法。您可以看到,在接收器对象上调用了一个方法。 为什么这很重要?因为如果你认真思考它,它会揭示你遇到困难的罪魁祸首:
因此,解决问题的第一步是创建一个处理通知的对象,并且可以独立配置以根据环境进行适当的操作。请注意,此对象本身不应该知道或关心环境,但应该可配置,以便您可以在开发中轻松模拟它,这可能发生在您的{ {1}}文件或初始值设定项(可能称为development.rb
,将根据任何环境配置它)。
就使用不同的API密钥而言,这完全是一个单独的问题 - 您真的不希望将这些存储在您的存储库中,并且通常接受的方法是配置您正在运行的环境在维持他们。对于Heroku,作为一个流行的示例,您可以运行configure_notifier.rb
,然后通过heroku config:add SOMESERVICE_API_KEY=abcdefg12345
在您的配置中访问它。