1

私はこの種の表記法を他の場所で見たことがあります:@user = FactoryGirl.create(:user)しかし、このインスタンス変数の振る舞いを正確に把握することはできません。工場の女の子が作成する永続的なデータにインスタンス変数を割り当てる動作

具体的には、このインスタンス変数の動作が不思議です。たとえば、RSpecで統合テストを作成しています。 (例えば、@video.titleを使用して))私はビデオインスタンスの異なる属性にアクセスして、その点で支障がない

@video = FactoryGirl.create(:video, title: "Test title") 

:試験の一つで、私は私のVideoクラスのインスタンスにインスタンス変数を割り当てようとしました。

しかし、ユーザーがフォームの「タイトル」フィールドをクリアできるようにするための統合テストを作成しています。ビデオが更新されると、タイトルがデータベースで消去されます。例えば、何らかの理由で

click_link "Edit" 
fill_in "Title", with: "" 
click_button "Update Video" 
expect(find('#title')).to_not have_content "Test title" 

、正しくページが表示されますが、私はインスタンス変数を使用してインスタンスにアクセスしようとすると、何の変化が発生していない:print @video.title戻り"Test title"

を奇妙である何がそのAでありますさまざまな統合テスト私はビデオインスタンスの属性を更新するために同様のプロセスを使用します(たとえば、「更新されたテストのタイトル」)。私は次に、属性がウェブページ内で正しく更新されているかどうかを確認するためにテストしましたが、この時間インスタンス変数も反映しました(print @video.titleを使用)。

これがなぜこのようになるのでしょうか。

+3

DBからレコードを更新するために '@ video.reload.title'を試してください。 –

+1

@SergiiKは正しいアイデアを持っています。 '@ video'を作成すると、データベースの変更(ビデオオブジェクト内の静的コピー)から切断されます。' reload'は、最初の割り当て以降に加えられた変更をデータベースからリフレッシュします。 – engineersmnky

+0

@engineersmnky、ありがとう、これは問題を解決しました!このためのリソースはありますか、それについて私が見ることができるドキュメントはありますか?あなたは私の元の投稿からでもわかることができたかもしれませんが、私がこれを理解するためにどのような質問をするかを知ることさえ困難でした。 – RyanQuey

答えて

0

解決策は、@video.reload.titleを使用してDBからレコードを更新することです。

@videoを作成すると、データベースの変更(ビデオオブジェクトの静的コピー)reloadとの接続が切断され、最初の割り当て以降に加えられた変更がデータベースから更新されます。

リソースが含まれます:

(クレジットは、上記のコメントに質問に答え@SergiiKと@engineersmnkyに行く。)

関連する問題