【发布时间】:2013-02-14 05:40:50
【问题描述】:
我已经完成了 Hartl 的 Rails 教程,但仍然存在一个困惑:我什么时候使用 @variable,什么时候应该使用 :variable,以及什么时候只是 variable 正确?
这是我从tutorial 获取的一些示例代码:
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是否需要在第一个 sn-p 中使用@,因为它是主题还是..? - 我是否总是使用
:声明新变量? (实际上我很确定情况并非如此,但我不明白其中的原因和原因。) - 当我稍后引用我使用
:创建的变量时,我是否再次使用:?例如,如果我要执行print(:older_micropost)或print(older_micropost),有区别吗? (参见第二个 sn-p 中的let语句)。 - 它们在
before块内的工作方式与在块外的工作方式相同吗?我发现有些代码只能在before块内/外工作(例如older_micropost.destroy)。
我已经在别处寻找过这个问题的答案,但我找不到关于@、: 的所有三个的讨论,什么都没有。
编辑:这是第三个 sn-p 代码,这次是我自己的。我已经评论了哪些有效,哪些无效:
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 块中工作?
【问题讨论】:
标签: ruby-on-rails rspec capybara railstutorial.org