2012-03-01 2 views
0

У меня есть Категории контроллера и в макете _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 

конец

ответ

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 

Я лично предпочитаю второй путь, потому что мне не нравится вызовы базы данных, вызванные в представлениях.

+0

Хорошо, но как я должен исправить эту проблему? Где я должен позвонить @categories = Category.all? Если я добавлю его в один статический сайт, он работает, но я не хочу добавлять его ко всем методам моего кода. – user1107922

+0

Обновлен ответ. – iltempo

+0

Спасибо большое :) – user1107922

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