ruby-on-rails - Rails 的开发环境和生产环境之间有哪些重要区别?

标签 ruby-on-rails activerecord development-environment

由于 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.rbconfig/environments/development.rb 文件并阅读有关所使用的方法/属性的注释和文档。在我的脑海中,有一些差异:

  1. 代码不会在生产环境中重新加载,因此如果您有任何设置为 Time.now1.day.ago 的常量,或者在开发中可以用作的任何常量预计它们不会在生产环境中工作。
  2. 调试级别日志消息在生产中被忽略。
  3. 仅在生产环境中启用缓存
  4. 详细错误消息仅在开发中可用(尽管它们会记录到 Rails 日志中)

可能还有更多,但如果您只查看配置文件,您应该很好地了解其中的差异。

此外,还有一个简短的代码评论:

  1. rescue foo 模式通常是一个坏主意。可能提出的合法错误将被忽略。
  2. 使用 ActiveRecord SQL 插值将动态值添加到 SQL 字符串,请勿使用 #{}

关于ruby-on-rails - Rails 的开发环境和生产环境之间有哪些重要区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4739209/

相关文章:

ruby-on-rails - 优雅的 Rails : multiple routes, 相同的 Controller Action

ruby-on-rails - Heroku 可靠吗?

ruby-on-rails - Rails Eager 加载(包括)和 where 子句不起作用?

macos - Textmate,从项目搜索中排除文件(类型?)

php - "PHP combined with MySQL are cross-platform (you can develop in Windows and serve on a Unix platform)"到底是什么意思?

ruby-on-rails - 不同 Controller 中的 Rails 渲染 Action

ruby-on-rails - ActionController::UrlGenerationError 缺少必需的键:[:id]

ruby-on-rails - ActiveRecord Relation where method matching on unique id returns object slightly diff then when traversing the array and matching on the same id

ruby-on-rails - 在 ActiveRecord where 子句中使用实例方法

google-chrome - 有没有办法从 Chrome 开发者工具中导出时间图?