我已经完成了 Hartl 的 Rails 教程,但仍然存在一个困惑:我什么时候使用@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)
orprint(older_micropost)
,有区别吗?(参见let
第二个片段中的语句)。 - 它们在一个街区内的工作方式与在
before
街区外的工作方式相同吗?我发现某些代码只能在before
块内部/外部工作(例如older_micropost.destroy
)。
我在别处寻找过这个问题的答案,但我找不到关于 、 和什么都没有的@
讨论:
。
编辑:这是第三段代码,这次是我自己的。我已经评论了哪些有效,哪些无效:
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 块内运行两行或在外面运行两行)
为什么这些语句只能在 before 块内工作?