0

我有一个关于红宝石的非常蹩脚的问题。我有以下代码:

@node          = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
  query do
    fuzzy_like_this @node.title
  end
end

问题是,由于某种原因,我无法在线访问@node变量fuzzy_like_thisnil即使找到了节点,它也会返回,我可以在第二行访问它。你能给我任何建议,为什么会发生这种情况,我能做些什么来更好地理解这种行为?我什至不知道如何搜索。


编辑:抱歉标题中的错字,当然它不应该是“全局”变量,而是实例变量。

4

2 回答 2

2

Node 是一个实例变量,而不是全局变量。由于该块可能(在这种情况下,是)在另一个对象的上下文中执行,因此您的 ivars 不存在。将 ivar 值分配给本地名称应该可以工作,因为本地是词法范围的。

tl; dr: ,在块内node = @node使用本地。node

于 2013-11-05T20:31:31.093 回答
1

以“@”开头的变量不是全局变量;它们是实例变量。这意味着它们属于特定对象,(大部分)无法从其他对象访问。

似乎正在发生的事情是该search方法正在改变执行的上下文(可能通过instance_eval/ instance_exec),这意味着,在块内,你self是不一样的,你将无法访问相同的实例变量。

一个简单的解决方法是改用局部变量:

node           = Node.find(params[:id])
@similar_nodes = Tire.search 'nodes', load: true do
  query do
    fuzzy_like_this node.title
  end
end

然后,如果你真的需要node一个实例变量,你可以稍后分配它:

@node = node
于 2013-11-05T20:32:15.630 回答