我是红宝石和铁轨的新手,我意识到这是一个基本问题,但是我到处搜索并尝试其他人针对此错误的建议。
我遇到此错误
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 %>
答案 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。
干杯。