我是 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--> 然后什么也不打印... 那么为什么这不起作用?
我不确定你想在这里做什么,但似乎@tasks在这里为零。你可以用@tasks.nil检查一下吗?
但是请记住,如果@tasks是一个数组,它不会给你nil? -> true 而你需要使用 <
Array
>.empty?
更安全的检查方法是:
@task.try(:attribute).try(:attribute2) etc
也许你应该以不同的方式建模。
你为什么这么做
@tasks[activity['taskid']]['assignee']
首先???
您应该能够执行类似
activity.assignee
或 `activity.task.assignee`` 的操作
我猜你有一个活动、任务和受让人模型。好吧,也许你没有受让人。
但是对于前两个你可以做这样的事情,并且遵循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>
我会说尝试:
td class="kanban-task-handler">by: <%=h (!@tasks[activity['taskid']]['assignee']) or ""%></td>
您还可以使用
rescue
关键字来处理同一行中的异常,试试这个
<td class="kanban-task-handler">by: <%=h (@tasks[activity['taskid']]['assignee'] rescue '') %></td>