0

我正在寻找一种干净的方式来获得不同的行为,具体取决于我们是在测试、开发、登台还是生产环境中。

我的问题很笼统,但我最好的具体例子是发送通知。假设我的用户模型对象中有一个名为 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。我不知道在哪里(哪些文件)以及如何初始化正确的通知程序。有任何想法吗?

谢谢!

4

1 回答 1

2

对于初学者,我将成为一个爱发牢骚的婊子——你没有一个函数,而是一个方法。您会看到,在接收器对象上调用方法。为什么这很重要?因为如果你仔细想想,它就会揭示出你遇到困难的罪魁祸首:

用户对象没有切换“通知”对象的输出位置的业务。

因此,解决问题的第一步是创建一个对象来处理通知,并且可以独立配置为根据环境适当地运行。请注意,这个对象本身不应该知道或关心环境,但应该是可配置的,以便您可以在开发中轻松地模拟它,这可能发生在您的development.rb文件或初始化程序中(也许调用configure_notifier.rb它将为任何环境配置它)。

至于使用不同的 API 密钥,那完全是一个单独的问题——你真的不想将它们存储在你的存储库中,而普遍接受的方法是配置你运行的环境以维护他们。对于 Heroku,作为一个流行的例子,你可以运行heroku config:add SOMESERVICE_API_KEY=abcdefg12345然后在你的配置中通过ENV['SOMESERVICE_API_KEY'].

于 2012-07-10T19:47:11.470 回答