我在尝试在测试期间以一对多关系访问我的关联模型时遇到问题。我不明白为什么以下不返回该关联。
我关心这个问题的原因是因为我想通过my_factory_girl_user.guardians.first使用Factory Girl给我的监护人打电话。我试图通过仅使用ActiveRecord进行简化,但它仍然没有表现出我的预期。
我是一个真正的Rails初学者,所以对此问题的任何建议或如何更好地调试它将非常感激!
问题:@ target_user.guardians为什么不返回任何内容?
用户模型
class User < ActiveRecord::Base
has_many :guardians, dependent: :destroy
...
end
守护者模型
class Guardian < ActiveRecord::Base
belongs_to :user
...
end
控制器规格
describe 'PUT #update' do
context 'when logged in and authorized' do
let(:new_attributes){
{level: 31}
}
it 'sets current guardian' do
@target_user = User.create!(profile_name: 'MyGuardian', system: 'Xbox One', region: 'North America', password: "password", password_confirmation: "password")
@target_guardian = Guardian.create!(level: 31, guardian_class: 'Titan', activity: 'Vault of Glass', user_id: @target_user.id)
puts "User: #{@target_user.inspect}"
puts "Guardian: #{@target_guardian.inspect}"
puts "user.guardians: #{@target_user.guardians}"
put :update, {id: @target_guardian.id, guardian: new_attributes}, {user_id: @target_user.id}
expect(assigns(:guardian)).to eq(@target_guardian)
end
end
输出
User: #<User id: 3147, email: nil, password_digest: "$2a$04$QPk3kCsKLp0IX.YmMPAPdO2gCe79mwVybHkFpcEsVkG...", created_at: "2014-12-16 02:55:57", updated_at: "2014-12-16 02:55:57", is_admin: nil, profile_name: "MyGuardian", system: "Xbox One", region: "North America">
Guaridan: #<Guardian id: 3284, created_at: "2014-12-16 02:55:57", updated_at: "2014-12-16 02:55:57", user_id: 3147, fireteam_id: nil, level: 31, guardian_class: "Titan", activity: "Vault of Glass", comment: nil>
user.guardians:
答案:
感谢Typpex的帮助!我的问题是在创建Guardian之后我没有刷新用户,我使用的解决方案是在创建Guardian之后添加以下行。有关更多信息,请阅读以下答案。
@target_user.reload
答案 0 :(得分:-1)
这是因为你从未真正将监护人添加到用户的监护人名单中,例如:
@target_user.guardians << @target_guardian
只有在那之后你才能在@ target_user.guardians中看到监护人。
使用rspec进行测试时,您需要在控制器中调用该操作,该操作实际上是将监护人添加到用户的监护人集合中,然后测试监护人是否正确添加了类似
的内容@target_user.guardians.size.should_be 1