1

我刚刚完成了一个月的 Rails 教程,这是我建立的网站:https ://warwicktri.herokuapp.com/ 。现在我正在尝试将 Instagram 提要拉到主页上,但我在本地主机上的 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>
4

1 回答 1

0

在朋友的帮助下,我意识到了哪里出了问题以及如何纠正 NoMethodError。

这个答案有 2 个部分:
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在我的 instagram_controller.rb 中声明时,我试图将数据呈现到我的 pin 视图(views/pins/index.html.erb)中。但是,我没有@instagram在我的 pins_controller.rb 中声明。
  • 所以我@instagram = Instagram.user_recent_media("264208635")从instagram_controller.rb 复制过来,粘贴到我的pins_controller.rb 下的index 方法下;像这样:

我的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)而不是之后添加。然后,它奏效了。

于 2015-01-05T11:24:30.010 回答