método indefinido 'agendas' para nil:NilClass Actioncontroller?

Esencialmente, tengo una aplicación que usa Devise, tengo un modelo de usuario y un modelo de agenda. Agenda 'belongs_to' user y user 'has_many' agenda, estas son mis relaciones de db. Puedo activar IRB y obtener datos de db correctamente user = User.first user.agendas y obtendré una lista de todas las publicaciones que pertenecen a ese usuario Mi problema ocurre al iniciar sesión, el usuario es redirigido a home#index pero obtengo un NoMethodError en Home#index método indefinido 'agendas' para nil:NilClass Estoy seguro de que me estoy perdiendo algo. ¿Necesito un método de índice en mi controlador de agenda también? ..app/views/home/index.html.erb

<h3>Home</h3>
<div class="row">
    <div class="span8">
        <% if @user.agendas.any? %>
        <h3>Agendas</h3>
        <ol class="agendas">
            <%= render @agendas %>
        </ol>
        <% end %>
    </div>
</div>

mi home_controller.rb

class HomeController < ApplicationController
  before_filter :authenticate_user!

  def index
    @agendas = current_user.agendas.paginate(page: params[:page])
  end

Mi controlador de agenda solo tiene un trozo de creación y destrucción para el código futuro. su modelo /agenda.rb

class Agenda < ActiveRecord::Base
  attr_accessible :title
  belongs_to :user

  validates :title, presence: true, length: { maximum: 140 }
  validates :user_id, presence: true

  default_scope order: 'agendas.created_at DESC'
end

preguntado el 03 de mayo de 12 a las 18:05

atrapé mi myproblem ... home.html.erb debería ser current_user.agendas.any? -

pero las agendas no se llenan, ¿alguien ve algún problema con el código de visualización? -

1 Respuestas

Tu error viene de esto:

<% if @user.agendas.any? %>

y el error dice que @user is nil. Tu controlador dice:

def index
  @agendas = ...
end

No veo @user se le asigna un valor allí. no creo que tu authenticate_user! el filtro se está configurando @user cualquiera. Así que podrías hacer esto:

def index
  @user    = current_user
  @agendas = @user.agendas.paginate(page: params[:page])
end

Y entonces:

<% if @user.agendas.any? %>
  <h3>Agendas</h3>
  <ol class="agendas">
    <%= render @agendas %>
  </ol>
<% end %>

También podrías acceder current_user directamente en su ERB:

<% if current_user.agendas.any? %>
  <h3>Agendas</h3>
  <ol class="agendas">
    <%= render @agendas %>
  </ol>
<% end %>

Pero ten en cuenta que ya te has tomado la molestia de calcular @agendas Entonces, ¿por qué no mirar eso y dejar tu controlador en paz?

<% if @agendas.present? %>
  <h3>Agendas</h3>
  <ol class="agendas">
    <%= render @agendas %>
  </ol>
<% end %>

contestado el 03 de mayo de 12 a las 18:05

Gracias por la respuesta, la encontré. - elirishguy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.