控制器中的Rails NoMethodError

时间:2011-10-14 20:07:07

标签: ruby-on-rails controller nomethoderror

这是我的控制器

def results
#searches with tags
@pictures = Picture.all
@alltags = Tag.all
searchkey = params['my_input']
pList = []
listsize = 0
while listsize < @pictures.size
  pList[listsize] = 0
  listsize += 1
end
@alltags.each do |tag|
  if searchkey == tag.tagcontent
    pList[tag.picture.id-1] += 1
  end
end
@pictures.each do |picture|
  if searchkey == picture.name
    pList[picture.id-1] += 1
  end
end
@pictures = @pictures.sort {|pic1, pic2| pList[pic2.id-1] <=> pList[pic1.id - 1]}

调用此错误时会出现此错误

SearchController中的NoMethodError#results

当你没想到它时,你有一个零对象! 您可能期望一个Array实例。 在评估nil。+时发生错误 Rails.root:/ Users / kevinmohamed / SnapSort / server

应用程序跟踪|框架跟踪|完整追踪 app / controllers / search_controller.rb:31:block in results' app/controllers/search_controller.rb:29:in每个' app / controllers / search_controller.rb:29:在`results'

31是pList [picture.id-1] + = 1,29是@ pictures.each do | picture |,为什么会出现这个错误

2 个答案:

答案 0 :(得分:1)

pList是一个数组,索引为0,1,2,3,4 ...

你的行

pList[picture.id-1] += 1

可能是指不存在的索引。例如,如果pList有50个成员,则它具有0-49的不足。如果上面图片的id是7891,那么它将尝试找到7890的索引,当然不存在。这将返回nil,并尝试执行“nil + = 1”,这是您的错误来源。

也许pList应该是由图片ID键入的哈希?取决于你想要完成的事情。但无论你想做什么,几乎可以肯定的是,在Ruby中表达它的方式也不那么冗长。

答案 1 :(得分:0)

当你正在迭代的东西产生了一个nil时,就会发生这个错误。你的控制器中有很多代码。我建议将一些逻辑转移到模型的方法中并为其编写一些测试,包括在标签或图片不可用时引发错误。然后,您可以挽救控制器中的错误,以显示更友好的错误消息。