在Ruby on Rails网站上实现Instagram Gem时的NoMethodError

时间:2014-12-24 07:59:02

标签: ruby-on-rails instagram instagram-api

我刚刚完成了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>

1 个答案:

答案 0 :(得分:0)

在我的朋友的帮助下,我意识到我出错的地方以及如何纠正NoMethodError。

这个答案分为两部分:
1)将Instagram代码添加到引脚控制器中 2)为Instagram数据使用单独的控制器

请注意,此答案专门针对One Month Rails教程,可能会也可能不会直接适用于每个Web应用程序。

1)将Instagram代码添加到引脚控制器

  • Mattan Griffel关于respond_with(@pins)部分是正确的。 respond_with(@pins)导致我的控制器操作跳过剩下的部分 那个部分。所以当我改变代码的顺序时,它就有效了。
  • 我很可能在Mattan建议之后尝试删除它时犯了另一个错误,因此它不起作用(参见上面的评论)。

我的一部分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数据使用单独的控制器

  • 即使我使用单独的控制器,我也得到了相同的NoMethodError,因为当我在instagram_controller.rb中声明@instagram时,我试图将数据渲染到我的引脚视图中(views / pins / index.html。 ERB)。但是,我没有在我的pins_controller.rb中声明@instagram
  • 所以我从instagram_controller.rb复制了@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}}。然后,它奏效了。