我在测试期间尝试以一对多关系访问关联模型时遇到问题。我不明白为什么下面不返回关联。
我关心这个问题的原因是因为我想使用 Factory Girl 通过 my_factory_girl_user.guardians.first 来调用我的监护人,但这是行不通的。我试图通过仅使用 ActiveRecord 来简化,但它仍然没有达到我的预期。
我是一个真正的 Rails 初学者,所以任何关于这个问题或如何更好地调试它的建议都将不胜感激!
问题:为什么@target_user.guardians 不返回任何东西?
用户模型
class User < ActiveRecord::Base
has_many :guardians, dependent: :destroy
...
end
监护人模型
class Guardian < ActiveRecord::Base
belongs_to :user
...
end
Controller 规范
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 的帮助!我的问题是我在创建守护者后没有刷新用户,我使用的解决方案是在创建我的守护者后添加以下行。有关更多信息,请阅读下面的答案。
@target_user.reload
最佳答案
这是因为您实际上从未将监护人添加到用户的监护人列表中,例如:
@target_user.guardians << @target_guardian
只有在那之后,您才能在@target_user.guardians 中看到监护人。
当使用 rspec 进行测试时,您需要调用 Controller 中的操作,该操作实际上将监护人添加到用户的监护人集合中,然后测试监护人是否已正确添加,例如
@target_user.guardians.size.should_be 1
关于ruby-on-rails - 使用 Rspec 进行 Controller 测试中的 Rails 协会问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496977/