我有类别控制器和布局_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
端
答案 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
我个人更喜欢第二种方式,因为我不喜欢在视图中触发的数据库调用。