2011-01-19 17 views
2

今日私は、Railの生産環境と開発環境の違いのために、ひどい問題を経験しました。コードを考えてみましょう:@のsubscription_plan.affiliate私は、クエリがアフィリエイトなしのみのサブスクリプションプランを返すことが期待nillであるかのようRailsの開発環境と本番環境の重要な違いは何ですか?

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

、0のIDを持つ任意の関連会社があってはなりません。 nil.idがエラーをスローするため、開発環境でうまくいきます(それについてのメッセージが間違って4になることを前提としています)。問題は、私はそのコードを私のプロダクションサーバーとサブスクリプションプランに、affiliate_idが4で全部表示された状態で公開しました。プロダクションでは、nil.idはエラーを投げず、むしろ単純に4を返します。さあ、ありがとう。

Railsの開発者は他に何を知っておくべきですか?特に、潜在的に問題を引き起こす可能性のある環境間の相違点はありますか?

答えて

5

生産と開発の間で異なるものはすべて設定可能です。本番でwhiny nil秒をしたい場合は、あなたのproduction.rbファイルに以下を追加:

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

ちょうどあなたのconfig/environments/production.rbconfig/environments/development.rbファイルを見て、使用されているメソッド/プロパティに関するコメントやドキュメントを読んで。私の頭の上から、ここではいくつかの違いがあります:

  1. コードが生産に再ロードされていないので、あなたが期待どおりに動作し、開発にTime.nowまたは1.day.agoまたは任意に設定されている任意の定数を持っている場合、彼らが」勝ちましたプロダクションでの作業。
  2. debugレベルログメッセージは本番環境では無視されます。

(それらはレールログに記録されているが)

  • キャッシュが唯一
  • 詳細なエラーメッセージが開発でのみ使用可能です生産に有効になっているがありますより多くの、おそらく、しかし、あなたはちょうどチェックアウトする場合設定ファイルの違いが何であるかを知る必要があります。

    はまた、簡単なコードの批評:

    1. rescue fooパターンは、一般的に悪い考えです。正当化された可能性のあるエラーは無視されます。
    2. ActiveRecord SQL補間を使用して、動的値をSQL文字列に追加します。#{}は使用しないでください。
  • +0

    ありがとう:

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

    が次にあなたのような何かを行うことができます...

    class SubscriptionPlan < ActiveRecord::Base belongs_to :affiliate end 

    使用法:

    最後は、あなたのコードは、ActiveRecordのをより有効に活用するためにリファクタリングする必要があります、 いいアドバイス! – tybro0103

    +0

    ええ、これは私の実際のコードではありませんでした。私は可能な限り簡単に同じnil.id問題を再現した行を書き込もうとしました。 – tybro0103

    +0

    ああ、良い:)あなたは@ Beerlingtonのモデル設定の提案に従っていることを望みます。 FWIW私は彼がどんな無礼を意図したとは思わないし、彼のアドバイスは悪くない。 –

    0

    まず、私はこれがProduction vs Developmentの問題であるとは確信していません。各環境で異なるバージョンのRubyを使用していますか?もしそうなら、RVMを使って同じバージョンを使うことをお勧めします。

    第2に、運用サーバーをミラーリングするステージング環境が必要です。同じクローンでテストしていないのであれば、実際に生産に移行するのは悪い習慣です。

    @subscription.first.affiliate 
    
    関連する問題