由于 Rail 的生产和开发环境之间的差异,我今天遇到了一个可怕的问题。考虑代码:
"select * from subscription_plans where affiliate_id is null or affiliate_id = #{@subscription_plan.affiliate.id rescue 0};"
永远不会有任何 id 为 0 的附属机构,因此如果 @subscription_plan.affiliate 为 nil,我希望查询仅返回没有附属机构的订阅计划。在开发环境中工作得很好,因为 nil.id 会抛出一个错误(假设它确实给出了一些关于它的消息,应该错误地为 4)。问题是,我将该代码实时推送到我的生产服务器,并且affiliate_id 为 4 的订阅计划开始出现。在生产环境中,nil.id 不会抛出错误,而只是返回 4。天哪,谢谢rails。
除此之外,作为 Rails 开发人员我还应该注意哪些其他事项?特别是,环境之间是否存在其他可能导致问题的差异?
最佳答案
生产和开发之间的所有不同之处都是可配置的。如果您希望在生产环境中出现提示的 nil
,请将其添加到您的 development.rb
文件中:
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
只需查看您的 config/environments/development.rb
和 config/environments/development.rb
文件并阅读有关所使用的方法/属性的注释和文档。在我的脑海中,有一些差异:
- 代码不会在生产环境中重新加载,因此如果您有任何设置为
Time.now
或1.day.ago
的常量,或者在开发中可以用作的任何常量预计它们不会在生产环境中工作。 调试
级别日志消息在生产中被忽略。- 仅在生产环境中启用缓存
- 详细错误消息仅在开发中可用(尽管它们会记录到 Rails 日志中)
可能还有更多,但如果您只查看配置文件,您应该很好地了解其中的差异。
此外,还有一个简短的代码评论:
rescue foo
模式通常是一个坏主意。可能提出的合法错误将被忽略。- 使用 ActiveRecord SQL 插值将动态值添加到 SQL 字符串,请勿使用
#{}
。
关于ruby-on-rails - Rails 的开发环境和生产环境之间有哪些重要区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4739209/