Rails,零对象错误

时间:2012-03-01 17:58:33

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我有类别控制器和布局_menu.html.erb我想输出主页中的所有类别但我有这样的错误消息:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

当我以管理员身份登录时,我可以添加,编辑,删除和查看所有类别。

这是我的代码的一部分:

_menu.html.erb

<div class="menu">
  <% @categories.each do |category| %>
    <li>
      <%= link_to category.title, category %>
    </li>
  <% end %>
</div>

Categories_controller.rb

  def index
    @title = "All categories"
    @categories = Category.paginate(:page => params[:page])
  end

  def show
    @category = Category.find(params[:id])
    @title = @category.title
  end

  def new
    @category = Category.new
    @title = "Add category"
  end

  def create
    @category = Category.new(params[:category])
   if @category.save
     flash[:success] = "Successfully added category"
     redirect_to categories_path
   else
     @title = "Sign up"
     render 'new'
   end
 end

 def edit
   @category = Category.find(params[:id])
   @title = "Edit category"
 end

 def update
   @category = Category.find(params[:id])
   if @category.update_attributes(params[:category])
     flash[:success] = "Category updated."
     redirect_to categories_path
   else
     @title = "Edit user"
     render 'edit'
   end
 end

 def destroy
   Category.find(params[:id]).destroy
   flash[:success] = "User destroyed."
   redirect_to categories_path
 end

1 个答案:

答案 0 :(得分:3)

@categories仅在索引操作中定义。我假设您在布局中使用_menu.html.erb作为部分 - 在每个页面上。

对于导致异常的其他人,@categories将为零。

基本上有两种方法可以为所有操作定义类别。 一个是在部分像

中进行调用

<% Category.all.each do |category| %>

使用控制器中的前置过滤器的另一种方法

class CategoriesController
  before_filter :load_categories

  ...

  private

  def load_categories
    @categories = Category.all
  end
end

我个人更喜欢第二种方式,因为我不喜欢在视图中触发的数据库调用。