为什么我在ERB模板中获取nil对象迭代数组?

时间:2010-11-24 08:56:08

标签: ruby-on-rails ruby erb

我是Ruby的新手,目前正在尝试一些实验。

我对这些脚本感到困惑:

<%=@myworlds[2].topic%>

<% id = 1 %>
<%=@myworlds[id+1].topic%>

@mywodrld是模型的实例,topic是字段。执行第一个时,程序正确运行。当我运行第二个脚本时,我收到以下错误:

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.topic

导致nil对象的原因是什么?

5 个答案:

答案 0 :(得分:4)

当我尝试你的方法时,我无法复制你的问题。这对我来说可以。我的猜测是你也可以在其他地方使用变量id,当你调用@myworlds [id + 1]时,.topic id还有其他一些值。但正如我所说,只是猜测。

但是,我建议您在Ruby中循环遍历模型集合时使用其他语法。尝试这样的事情:

<% @myworlds.each do |myworld| %>
  <h1><%= myworld.topic %></h1>
<% end %>

如果你真的需要迭代器的值,你可以随时使用:

<% @myworlds.each_with_index do|myworld, i| %>

我跟踪数组中的当前索引。另一件好事是在块结束后内存中不再存在id。

答案 1 :(得分:1)

您确定这两个代码段之间没有其他差异吗?

在您的评论中,您说@myworlds[@id+1],在原始问题中您说@myworlds[id+1](局部变量与实例变量)。你能展示确切的代码吗?

两个脚本都可以。您可以在一个<% %>块中创建变量,并且可以在另一个块中使用它们(当然,如果它们位于相同的.erb文件中)。

错误消息表明您的数组没有索引为@id+1id+1的元素。您必须调试用于索引的表达式的值。我想有一些小错误,比如拼写错误。

debug(@myworlds[@id+1])引发错误时@myworlds[@id+1].topic语句的输出是什么?

还尝试调试id

的值
<pre>The id = <%= debug(id) %> (<%= id.inspect %>)</pre>

(根据您的Rails版本,您可能需要使用h( id.inspect )

答案 2 :(得分:0)

我猜是因为某些原因id+1可能不等于2。

要检查id+1的值,您可以这样做:

raise (id+1).inspect

如果想要查看对象中的内容,Inspect非常有用:)

答案 3 :(得分:0)

我想我知道如何解决这个问题。您正尝试从模型中获取每个数组数据,但是您使用参数[@id+1]。无论“id”是全局变量还是局部变量,但问题出在数组末尾,没有索引为“id+1”的数组。您应该添加另一个参数以防止无法识别的参数。

试试这个

if((@myworlds.length-1) > @id)
    @id = @id+1
end

:D

答案 4 :(得分:0)

看起来你正在循环一个数组,但可能使用forwhile循环来完成它,而不是使用[].each。你的示例代码没有给我们足够的信息来工作,所以我们在黑暗中试图帮助你。

手动创建索引然后尝试遍历数组往往会遇到问题,如果您错过了第一个或最后一个项目,或者您走得太远而得到您看到的错误。因为each只返回数组中的项目,所以不能这样做。

这样的事情可能会更好:

<% @myworlds.each do |world| %>
  ...
  <%= world.topic %>
<% end %>

在我写回复之前,我没有看到@DanneManne给出的答案。我认为他有正确的解决方案。