ruby nil:NilClass的undefined方法“[]"):[副本]

ghhkc1vu  于 2023-10-18  发布在  Ruby
关注(0)|答案(4)|浏览(112)

此问题已在此处有答案

10年前关闭。

可能重复:

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):

但是我检查这个变量,如果它是nil-->,那么什么都不打印出来.为什么不管用呢

w8ntj3qf

w8ntj3qf1#

我不知道你在这里想做什么,但似乎@tasks在这里是空的。你可以用@tasks.nil来检查它吗?
但是请记住,如果@tasks是一个数组,它不会给你给予nil?-> true你需要使用< Array >.empty?
一个更安全的检查方法是:

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

mnemlml82#

也许你应该用不同的方式来塑造它。
为什么你一开始就做@tasks[activity['taskid']]['assignee']???
您应该能够执行类似activity.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>
insrf1ej

insrf1ej3#

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

a5g8bdjr

a5g8bdjr4#

你也可以在同一行中使用rescue关键字来处理异常,试试这个

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

相关问题