未定义的方法`agendas'为nil:NilClass Actioncontroller?

时间:2012-05-03 17:11:30

标签: ruby-on-rails ruby devise

基本上我有一个app usong Devise,我有一个用户模型和一个议程模型。议程'belongs_to'用户和用户'has_many'议程,这些是我的数据库关系。我可以启动IRB并正确获取数据库数据     user = User.first     user.agendas 我将获得属于该用户的所有帖子的列表 我的问题发生在登录时,用户被重定向到home #index,但我在Home中找到NoMethodError #index undefined方法`agendas'为nil:NilClass 我确定我错过了什么。我的议程控制器中是否还需要索引方法? ..app /视图/家/ 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>

my home_controller.rb

class HomeController < ApplicationController
  before_filter :authenticate_user!

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

我的议程控制器只有一个创建和销毁存根以供将来的代码使用。 它的型号/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

1 个答案:

答案 0 :(得分:0)

您的错误来自:

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

并且错误表明@usernil。你的控制器说:

def index
  @agendas = ...
end

我没有看到@user被分配了值。我认为您的authenticate_user!过滤器也不会设置@user。所以你可以这样做:

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

然后:

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

您也可以直接在ERB中访问current_user

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

但请记住,您已经遇到了计算@agendas的麻烦,那么为什么不看看它并让您的控制器独自一人?

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