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'... 仅有时会出错?