我刚刚完成了One Month Rails教程,这是我构建的网站:https://warwicktri.herokuapp.com/。现在我试图将Instagram Feed添加到主页上,但是我在本地主机上的Pins #index中得到了NoMethodError。
undefined method `each' for nil:NilClass
<div>
<% @instagram.each do |instagram| %>
<%= image_tag instagram.images.first.last.url %>
<% end %>
</div>
我认为这意味着@instagram没有被正确宣布,但我不知道我哪里出错了。
这是我的pins_controller.rb中的代码:
def index
@pins = Pin.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 5)
respond_with(@pins)
@instagram = Instagram.user_recent_media("264208635")
respond_with(@instagram)
end
我也尝试将@instagram放在另一个控制器中,但我仍然得到同样的错误:
class InstagramController < ApplicationController
def index
@instagram = Instagram.user_recent_media("264208635")
respond_with(@instagram)
end
end
我应该如何在我的代码中声明@instagram?
更新1:我的视图代码(index.html.erb):
<div id="pins" class="transitions-enabled">
<% @pins.each do |pin| %>
<div class="box panel panel-default">
<%= link_to image_tag(pin.image.url(:medium)), pin %>
<div class="panel-body">
<p><%= pin.description %></p>
<p><strong><%= pin.user.name if pin.user %></strong></p>
<% if pin.user == current_user %>
<div class="actions">
<%= link_to edit_pin_path(pin) do %>
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span> Edit
<% end %>
<%= link_to pin, method: :delete, data: { confirm: 'Are you sure?' } do %>
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete
<% end %>
</div>
<% end %>
</div>
</div>
<% end %>
</div>
<div class="center">
<%= will_paginate @posts, renderer: BootstrapPagination::Rails %>
</div>
<div>
<% @instagram.each do |instagram| %>
<%= image_tag instagram.images.first.last.url %>
<% end %>
</div>
答案 0 :(得分:0)
在我的朋友的帮助下,我意识到我出错的地方以及如何纠正NoMethodError。
这个答案分为两部分:
1)将Instagram代码添加到引脚控制器中
2)为Instagram数据使用单独的控制器
请注意,此答案专门针对One Month Rails教程,可能会也可能不会直接适用于每个Web应用程序。
1)将Instagram代码添加到引脚控制器
respond_with(@pins)
部分是正确的。
respond_with(@pins)
导致我的控制器操作跳过剩下的部分
那个部分。所以当我改变代码的顺序时,它就有效了。我的一部分pins_controller.rb:
def index
@instagram = Instagram.user_recent_media("264208635")
@pins = Pin.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 5)
respond_with(@pins)
end
2)为Instagram数据使用单独的控制器
@instagram
时,我试图将数据渲染到我的引脚视图中(views / pins / index.html。 ERB)。但是,我没有在我的pins_controller.rb中声明@instagram
。@instagram = Instagram.user_recent_media("264208635")
并将其粘贴到我的pins_controller.rb索引方法下;像这样:我的一部分pins_controller.rb:
def index
@instagram = Instagram.user_recent_media("264208635")
@pins = Pin.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 5)
respond_with(@pins)
end
同样,respond_with(@pins)
会导致我的控制器操作跳过部分的其余部分,因此必须在@instagram = Instagram.user_recent_media("264208635")
之前添加respond_with(@pins)
,而不是之后添加{{1}}。然后,它奏效了。