未定义的方法`[]'为nil:NilClass):

时间:2012-12-23 17:57:06

标签: ruby ruby-on-rails-3

  

可能重复:
  NoMethodError (undefined method `[]' for nil:NilClass)

我是rails 3的新手,我正在尝试将某些内容渲染为HTML表单:

<td class="kanban-task-handler">by: <%=h (!@tasks[activity['taskid']]['assignee'].nil? ? @tasks[activity['taskid']]['assignee'] : '') %></td>

但是我收到了这个错误:

undefined method `[]' for nil:NilClass):

但是我正在检查这个变量并说明它是否为零 - &gt;什么都没打印出来...... 那么为什么这不起作用?

4 个答案:

答案 0 :(得分:2)

我非常注意你在这里尝试做什么?,但似乎@tasks在这里没有。你可以用@ tasks.nil查看它吗?

但请记住,如果@tasks是一个数组,它不会给你零? - &GT;相反,您需要使用&lt; Array&gt; .empty?

更安全的检查方法是

@task.try(:attribute).try(:attribute2) etc

HTH

答案 1 :(得分:1)

也许你应该以不同的方式对它进行建模。

为什么你首先做@tasks[activity['taskid']]['assignee'] ???

您应该可以执行activity.assignee或`activity.task.assignee``

之类的操作

我猜你有一个Activity,Task和Assignee模型。好吧,也许你没有受让人。

但是前两个你可以做这样的事情,并且跟随Law of Demeter你不应该调用多个类的方法。

class Task < ActiveRecord::Base
  has_many :activities

  def assignee_name
    try(:assignee) || 'No assignee' # or ''
  end
end

class Activity < ActiveRecord::Base
  belongs_to :task

  delegate :assignee_name, to: :task
end

现在你可以这个

<td class="kanban-task-handler">by: <%=h ativity.assignee_name %></td>

答案 2 :(得分:0)

我会说尝试:

td class="kanban-task-handler">by: <%=h (!@tasks[activity['taskid']]['assignee']) or ""%></td>

答案 3 :(得分:0)

您也可以使用rescue关键字来处理同一行中的异常,请尝试此操作

<td class="kanban-task-handler">by: <%=h (@tasks[activity['taskid']]['assignee'] rescue '') %></td>