私は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)、違いはありますか?(let2番目のスニペットのステートメントを参照してください)。
- 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ブロック内でのみ機能するのはなぜですか?