Rails, ноль объектных ошибок - PullRequest
0 голосов
/ 01 марта 2012

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

end

1 Ответ

3 голосов
/ 01 марта 2012

@categories определены только в действии индекса. Я предполагаю, что вы используете _menu.html.erb как частичное в макете - на каждой странице.

@categories будет нулевым для остальных, что вызовет исключение.

Существует два основных способа определения категорий для всех действий. Можно было бы сделать вызов в частичном, как

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

Другой способ использования фильтра before в вашем контроллере

class CategoriesController
  before_filter :load_categories

  ...

  private

  def load_categories
    @categories = Category.all
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...