'人'为nil的未定义方法:NilClass

时间:2016-04-01 19:14:01

标签: ruby-on-rails ruby activerecord

我似乎无法理解为什么当我尝试对我的方法调用count时出现此错误消息?这是我的代码

<div class="container">
<h2>Statistics</h2>
<hr />

<h3 class="total-number">Total Signups: <%= @engaged %></h3>
<h3 class='total-number'> All Subscribed People: <%= @person %></h3>
<hr />
<p class='total-number'> Visitor group: <%= @visitor.people.count %></p>
<p class='total-number'> Dance group: <%= @dance.people.count %></p>
<p class='total-number'> Staff group: <%= @staff.people.count %></p>
<p class='total-number'> Volunteer group: <%= @volunteer.people.count %></p>
<hr />
<p><%= link_to "Send Message", root_path %></p>
</div>

这是我的控制器

  def subscribed_num
   @person = Person.subscribed.count
   @engaged = Person.count
   @dance = Group.find_by(name: "dance")
   @visitor = Group.find_by(name: "visitor")
   @volunteer = Group.find_by(name: "volunteer")
   @staff = Group.find_by(name: "staff")
  end

看起来很简单,但我可能做错了。

1 个答案:

答案 0 :(得分:3)

如果没有与名称匹配的组,

Group.find_by(name: 'something')将返回nil

所以游客,舞蹈,工作人员或志愿者之一似乎不存在。

处理此类情况的一种方法是使用Null Object来表示缺少某个群组。

空组可能总是有一个空数组。

以下是使用Avdi Grimm编写的优秀Naught gem的示例:

NullGroup = Naught.build do |builder|
  def people
    []
  end
end

# controller
def subscribed_num
  @person = Person.subscribed.count
  @engaged = Person.count
  @dance = Group.find_by(name: "dance") || NullGroup.new
  @visitor = Group.find_by(name: "visitor") || NullGroup.new
  @volunteer = Group.find_by(name: "volunteer") || NullGroup.new
  @staff = Group.find_by(name: "staff") || NullGroup.new
end
#