nil:NilClass 的未定义方法“每个”,但我使用了实例变量

Posted

技术标签:

【中文标题】nil:NilClass 的未定义方法“每个”,但我使用了实例变量【英文标题】:undefined method `each' for nil:NilClass but I have used an instance variable 【发布时间】:2019-01-19 22:00:29 【问题描述】:

我是 ruby​​ 和 rails 的新手,我意识到这是一个基本问题,但我到处搜索并尝试了其他人对此错误的建议。

我收到了这个错误

nil:NilClass 的未定义方法 `each'

但是我在控制器中使用 @ 使数组成为实例变量

控制器

  def a_list
    #Gibbon::Request.lists("9225cefb61").retrieve
  list = Gibbon::Request.lists("9225cefb61").members.retrieve(params: "fields": "members.email_address")
  list_hash = list.body
  a= list_hash["members"]
  @result_array= a.map  |email_array| email_array['email_address'] 
  end

view 
<%= "list emalis"%>
<br/>
<% a_list%>
<% @result_array.each do |item| %>
  <%= item %>
<% end %>

【问题讨论】:

您确定在此控制器操作中调用了a_list 方法吗?您能否显示完整的堆栈跟踪和控制器操作的实际来源? 必须是这个视图是从另一个动作渲染的,而不是a_list a_list 是什么?动作还是辅助方法?因为这听起来像是一个动作,但您在视图中手动调用它,为什么不直接在视图上执行a_list.each do |item|,因为您实际上是在那里调用该方法? 【参考方案1】:

错误是因为当控制器执行不同的操作时,这样的实例变量不一定会结转/设置,并且任何未定义的实例变量默认为nil值。假设此列表视图位于 ResultsController#show 上,一个选项是 ResultsController 看起来像:

before_action :a_list, only: :show

def show
  # Any other code for show
end

def a_list
  list = Gibbon::Request.lists("9225cefb61").members.retrieve(params: "fields": "members.email_address")
  list_hash = list.body
  @result_array =  list_hash['members'].map  |ea| ea['email_address'] 
end

这使用内置的Rails Filters 来处理消息链的执行,同时显示您的视图。由于#a_list#show 之前运行,@result_array 的值使其归结为视图。

【讨论】:

【参考方案2】:

正如@Justin P. 解释的那样,您应该使用过滤器,因为这是最好的方法。

另一个(更快)解决方案是将a_list 代码移动到您从视图中调用的相应操作。这样,您将获得正确的 @result_array ,您正在尝试在视图中访问。

干杯。

【讨论】:

以上是关于nil:NilClass 的未定义方法“每个”,但我使用了实例变量的主要内容,如果未能解决你的问题,请参考以下文章

Squeel 在 Rails 控制台中工作,但不在控制器中。错误:nil:NilClass 的未定义方法“方法”

nil:NilClass 的未定义方法“original_filename”

Cocoa Pods 的问题:nil:NilClass 的未定义方法“map”

Rails Event EventType模型关联 - nil的未定义方法`title':NilClass

CalendarPosts#index 中的 NoMethodError 用于 nil:NilClass 的未定义方法 'title'... 仅有时会出错?

Nokogiri:遇到错误“nil:NilClass 的未定义方法‘文本’”