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

时间:2019-01-19 22:00:29

标签: ruby-on-rails arrays ruby view controller

我是红宝石和铁轨的新手,我意识到这是一个基本问题,但是我到处搜索并尝试其他人针对此错误的建议。

我遇到此错误

  

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 %>

2 个答案:

答案 0 :(得分: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

这将使用内置的question来在显示视图时处理消息链的执行。由于#a_list#show之前运行,因此@result_array的值使其变为视图。

答案 1 :(得分:0)

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

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

干杯。