【问题标题】:undefined method `each' for nil:NilClass - Railsnil:NilClass的未定义方法“each” - Rails
【发布时间】:2016-06-22 03:50:45
【问题描述】:

我收到一个 nil 类错误。我完全理解这个错误告诉我什么,但我不知道为什么它是 nil。在我看来,应该有一个对象被传递到我的桌子上。这应该很容易调试。为了清楚起见,这是我的代码。

控制器方法:

def info
  @subscriber = Subscriber.find_by_phone_number(params[:phone_number])
end

查看:

 <% @subscriber.each do |subscriber| %>
  <tr>
   <td><%= image_tag avatar_url(subscriber) %></td>
  </tr>
 <% end %>

错误:

 Showing /Users/intern/Desktop/Rails/rowster/app/views/subscribers/info.html.erb where line #3 raised:
 undefined method `each' for nil:NilClass

对 info 方法的绑定:

[1] pry(#<SubscribersController>)> @subscriber
 => nil

如果您需要更多信息,请告诉我?

【问题讨论】:

  • 您在此处的代码之前运行info 了吗?否则@subscriber 不会被初始化。
  • 抱歉,“运行info”是什么意思?我对这一切有点陌生,所以我仍然想念愚蠢的事情
  • 你能在你的 info 方法上添加两个调试吗?在现有行下方,logger.debug @subscriber 和 logger.debug 参数。编辑输出
  • 这个错误意味着@subscriber 为nil。 Cary 所问的是您的信息操作是否在视图呈现之前运行。如果它正在运行,那么问题是您没有订阅者使用正在传递的电话号码。如果它没有运行,那就是您的问题。
  • 在你的info方法中,可以放置一个binding.pry来确认@subscriber的值吗?

标签: ruby-on-rails ruby


【解决方案1】:

这里有两个问题:

首先:@subscriber.eachundefined method 'each' for nil:NilClass 失败。这基本上告诉您您尝试在 nil 中调用 each,因此 @subscriber 必须是 nil。这意味着Subscriber.find_by_phone_number(params[:phone_number]) 没有返回订阅者。发送到服务器的电话号码在数据库中没有匹配的条目。

第二:即使数据库中有匹配的条目,您的代码也会失败。因为find_by_phone_number 将返回 one 订阅者而不是数组。因此调用each 会再次失败。

要解决这两个问题,请将代码更改为:

<% if @subscriber %>
  <tr>
    <td><%= image_tag avatar_url(@subscriber) %></td>
  </tr>
<% else %>
  <tr><td>No subscriber found!</td></tr>
<% end %>

并使用数据库中的电话号码。

【讨论】:

  • 用 调整if
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 2014-11-23
  • 2012-09-25
相关资源
最近更新 更多