无法从另一个模型访问一个模型的实例变量)(self.ruby)

时间:2014-07-18 22:56:29

标签: ruby-on-rails ruby testing rspec

我有两个模型,草稿和挑选。草稿在名为' available_players'的实例变量中创建一系列可用的玩家。这是使用&_ 39; before_save'打回来。回调运行实例方法' start'反过来运行' set_active_players'。我已经在Draft_spec中对所有​​这些进行了测试,我在加载玩家并将它们返回到available_players数组时没有任何问题。我的所有草案规范都通过了。

问题在于,当我尝试访问' available_players'来自Pick.rb的实例变量,它返回nil。如果我打电话给'draft.start' (应该在Draft.rb保存之前运行的实例方法),我可以突然访问' available_players'数组......它就像Draft对象没有创建available_players数组,即使我已经有了before_save方法。

以下是Pick.rb内部失败的代码:

def available_players_returns_nil
    @draft_object.available_players
end

以下是Pick.rb中的代码:

def available_players_working
    @draft_object.start
    @draft_object.available_players
end

我不想每次调用方法时都要调用start,因为available_players不需要重新加载所有玩家。请帮我看看available_players!

链接:failing Pick specsPick.rb

编辑: 我应该补充说使用

找到@draft_object
@draft_object = Draft.find(self.draft_id)

1 个答案:

答案 0 :(得分:1)

首先,这是错误的:

@draft_object = Draft.find(self.draft_id)

您已设置关联,因此请使用它。您只需在draft对象中使用Pick即可访问其所属的Draft。无需将其分配给名为@draft_object的实例变量。

player相同的故事。

顺便提一下,set_available_players中的Draft方法只是循环遍历所有玩家并将其添加到实例变量中。你为什么做这个?如果你需要Pick,你为什么不直接抓住玩家呢?像这样:

@players = Player.all

另外......我有点担心几乎所有的测试都被注释掉了。我希望这不是设计?