私はHartlのRailsチュートリアルを終了しましたが、混乱の1つの領域がまだ支配しています。いつ使用する@variable
のか、いつ使用する必要があるのか:variable
、そしていつvariable
正しいのか。
これが私がチュートリアルから取ったいくつかのサンプルコードです:
describe "micropost associations" do
before { @user.save }
let!(:older_micropost) do
FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
end
let!(:newer_micropost) do
FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
end
.
.
.
it "should destroy associated microposts" do
microposts = @user.microposts.dup
@user.destroy
microposts.should_not be_empty
microposts.each do |micropost|
Micropost.find_by_id(micropost.id).should be_nil
end
end
end
.
.
.
end
と比較して:
describe Micropost do
let(:user) { FactoryGirl.create(:user) }
before { @micropost = user.microposts.build(content: "Lorem ipsum") }
これ(および他のコード)が私に提起するいくつかのより具体的な質問があります:
@user
それは件名であるため、最初のスニペットにが必要@
ですか?- 常に新しい変数を使用して宣言し
:
ますか?(実際にはそうではないと確信していますが、その理由と理由はわかりません。) - 後で使用して作成した変数を参照するときに、もう一度
:
使用:
しますか?たとえば、print(:older_micropost)
またはを実行する場合print(older_micropost)
、違いはありますか?(let
2番目のスニペットのステートメントを参照してください)。 before
それらはすべて、ブロック内でも外部と同じように機能しますか?一部のコードはbefore
ブロックの内側/外側でのみ機能することがわかりました(例older_micropost.destroy
)。
私はこれに対する答えを他の場所で探しましたが、、、の3つすべての議論を見つけることができませ@
ん:
。
編集:これがコードの3番目のスニペットです。今回は私自身のものです。何が機能し、何が機能しないかについてコメントしました。
describe "deleting a user following" do
let(:userid) { @user.id }
before { print(@user.id.inspect) # this works
@user.destroy } # this works
@user.destroy # this doesn't
print(@user.id.inspect) # this doesn't
subject { other_user }
its(:followed_users) { should_not include(userid) }
end
(明らかに、コメント付きコードの4行すべてを一緒に実行するのではなく、beforeブロックの内側に2つ、または外側に2つ実行します)
これらのステートメントがbeforeブロック内でのみ機能するのはなぜですか?