我是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对象的原因是什么?
答案 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+1
或id+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)
看起来你正在循环一个数组,但可能使用for
或while
循环来完成它,而不是使用[].each
。你的示例代码没有给我们足够的信息来工作,所以我们在黑暗中试图帮助你。
手动创建索引然后尝试遍历数组往往会遇到问题,如果您错过了第一个或最后一个项目,或者您走得太远而得到您看到的错误。因为each
只返回数组中的项目,所以不能这样做。
这样的事情可能会更好:
<% @myworlds.each do |world| %>
...
<%= world.topic %>
<% end %>
在我写回复之前,我没有看到@DanneManne给出的答案。我认为他有正确的解决方案。