2017-12-24 11 views
1

私はRailsに慣れていないと思っていました。モデルに変更を加えるたびに、reload!をコンソールで実行する必要があると言われました。Ruby on Rails - モデルをリロードする必要があるときの不一致?

これらの2つのシナリオの前にreload!と呼んだとします。それは当然のことと同じようArticle.new(title: "Test 1")は、NoMethodErrorがスローされます実行

class Article < ActiveRecord::Base 
    validator :title, presence: true 
end 

はのは、私のような特定の構文エラーを持つモデルで、シナリオAを持っているとしましょう。しかし、私が入り込んでエラーを修正すると、reload!を実行しなくても、Article.new(title: "Test 1")が動作するようになりました。

シナリオB、逆方向に進みます。それが必要として

class Article < ActiveRecord::Base 
    validates :title, presence: true 
end 

Article.new(title: "Test 1")を実行すると、エラーなしで動作します:私は、次のような正しい構文でモデルを持っています。しかし、私が入ると、validatesvalidatorに変更してください。 reload!を実行しないと、article.rbファイルに構文エラーがあっても、Article.new(title: "Test 1")を実行しても動作します。 を明示的に実行してからNoMethodErrorを取得するまではありません。

ここでは何が起こっていますか?私はそれが非常に具体的であることを知っていますが、なぜこれが当てはまるのかわかりません。シナリオBのようにモデルを更新するためにreload!を実行しなければならないことがありますが、シナリオAのように時々そうではありません。

答えて

1

最初の例では、エラーが発生したため、Railsはクラスをロードできませんでした。エラーを修正した後、クラスが正常にロードされなかったため、クラスを再ロードする必要はありませんでした。

2番目の例では、クラスが正常に読み込まれました。したがって、クラスをメモリにリロードするようにRailsに指示するには、reload!に電話する必要があります。

+0

ああ!ありがとうございました!したがって、最初に成功しないと、基本的に自動的に次の実行時に自動的にリロードされます。 – rb612

+1

@ rb612はい。開発モードでは、Railsはデフォルトですべての定数をロードしません。どこでも参照されるとオンデマンドでロードされます。したがって、 'Article'に出会うと、この定数がメモリにロードされているかどうかをチェックし、そうでなければ' $ LOAD_PATH'にファイルの存在をチェックし、ロードされればそれをロードして定数を作成します'Article 'をコードに置き換えます。最初のケースでは、後者の部分が失敗したため、 'Article'定数は決して作成されなかったので、コードを修正して' Article.first'を再度実行すると、更新されたコードでクラスを正しくロードします。 – kiddorails

関連する問題