2014-12-24 3 views
1

Я только что закончил учебник One Month Rails, и это сайт, который я создал: https://warwicktri.herokuapp.com/. Теперь я пытаюсь вытащить фид Instagram на домашнюю страницу, но я получаю индекс NoMethodError в столбцах # на моем localhost.NoMethodError при внедрении Instagram Gem для сайта Ruby on Rails

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 в моем коде?

Update 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

run 'Instagram.user_recent_media (" 264208635 ")' в консоли rails может быть, это return 'nil' –

ответ

0

После некоторой помощи от моего друга, я понял, где я пошло не так и как исправить NoMethodError.

Там в 2 части к этому ответу:
1) Добавление кода Instagram в контроллеры штырьки
2) Используя отдельный контроллер для данных Instagram

Обратите внимание, что этот ответ специально для урока Один месяц Rails и может или не может применяться непосредственно к каждому веб-приложению.

1) Добавление кода Instagram в контроллеры булавки

  • Маттан Griffel был прав о 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

  • я получил тот же NoMethodError даже когда я использовал отдельный контроллер, потому что в то время как я объявил @instagram в моем instagram_controller.rb, я пытался отобразить данные в виде своих контактов (views/pins/index.html.erb). Однако я не объявлял @instagram в моем pins_controller.rb.
  • Итак, я скопировал @instagram = Instagram.user_recent_media("264208635") с instagram_controller.rb и вставил его в свой pins_controller.rb по методу индекса; например:

Часть моего pins_controller.гь:

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) и не после. Тогда это сработало.

Смежные вопросы