【问题标题】:What important differences are there between Rails' development and production environments?Rails 的开发环境和生产环境之间有什么重要区别?
【发布时间】:2011-01-19 18:35:43
【问题描述】:

由于 Rail 的生产环境和开发环境之间的差异,我今天遇到了一个可怕的问题。考虑代码:

"select * from subscription_plans where affiliate_id is null or affiliate_id = #{@subscription_plan.affiliate.id rescue 0};"

永远不会有任何 id 为 0 的附属公司,所以如果 @subscription_plan.affiliate 为 nill,我希望查询只返回没有附属公司的订阅计划。在开发环境中工作得很好,因为 nil.id 会引发错误(假设它确实给出了一些关于它应该错误地为 4 的消息)。问题是,我将该代码实时推送到我的生产服务器,并且affiliate_id 为 4 的订阅计划开始出现。在生产中,nil.id 不会抛出错误,而是简单地返回 4。天哪,感谢 rails。

要问这么多,作为 Rails 开发人员,我还应该注意哪些其他事项?特别是,环境之间是否存在其他可能导致问题的差异?

【问题讨论】:

    标签: ruby-on-rails activerecord development-environment


    【解决方案1】:

    生产和开发之间的所有不同之处都是可配置的。如果您想在生产中使用 nils,请将其添加到您的 production.rb 文件中:

    # Log error messages when you accidentally call methods on nil.
    config.whiny_nils = true
    

    只需查看您的 config/environments/production.rbconfig/environments/development.rb 文件并阅读有关所使用方法/属性的 cmets 和文档。在我的脑海中,这里有一些不同之处:

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

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

    另外,简短的代码评论:

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

    【讨论】:

    • 是的,这不是我的实际代码。我试图写一行尽可能简单地重现相同的 nil.id 问题。
    • 啊,很好 :) 希望您遵循@Beerlington 关于模型设置的建议。 FWIW 我不认为他有任何不尊重的意思,他的建议也不错。
    • 绝对没有任何不尊重的意思。我通常对回应很直率,只是认为解决这些问题可能会缓解一些令人头疼的问题。
    【解决方案2】:

    首先,我不认为这是生产与开发的问题。您是否在每个环境中使用不同版本的 Ruby?如果是这样,那么我建议使用 RVM 为两者使用相同的版本。

    其次,您应该有一个可以反映您的生产服务器的登台环境。如果您没有在相同的克隆上进行测试,那么推送到生产环境是非常糟糕的做法。

    最后,应该重构您的代码以更好地利用 ActiveRecord:

    class SubscriptionPlan < ActiveRecord::Base
      belongs_to :affiliate
    end
    

    用法...

    @subscriptions = SubscriptionPlan.find(:all, :include => :affiliate)
    

    然后你可以这样做:

    @subscription.first.affiliate
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 2013-07-14
      • 2010-11-27
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多