我正在尝试编写我的第一个自定义控制器操作并遇到NoMethodError。
场景:PostsController,标准的7个动作脚手架生成。
我希望索引页面显示单个帖子,而不是显示它们的列表。每个帖子都有一个“可见”复选框。我在Post模型中创建了一个名为named_scope
的{{1}},其中包含:
visible
并将它与.last一起应用到我的控制器中的索引操作:
named_scope :visible, :conditions => ["visible =?", true]
编辑我的索引视图以删除对数组部分的迭代,因此它只显示def index
@post = Post.visible.last
(format stuff)
end
等。所以现在我的索引只显示Posts表中的最后一条记录,其中True显示为可见。
然后,我想要创建一个所有帖子存档页面,无论可见性如何,都会显示所有这些页面,因此我创建了一个新的控制器操作:
(为清晰起见而编辑)
@post.title
创建了一个新的命名路线:
def archives
render :layout => 'posts'
@posts = Post.find(:all)
respond_to do |format|
format.html
format.xml { render :xml => @posts }
end
end
以及在views / posts下面名为archives.html.erb的视图。
Archives.html.erb看起来与脚手架创建的标准index.html.erb模板完全相同,带有
map.archives 'posts/archives', :controller => 'posts', :action => 'archives'
当我在浏览器中查看此页面时,出现错误
帖子#varives中的NoMethodError
当你没有想到它时,你有一个nil对象,你可能已经预料到了数组的意义,在评估nil.each时出错了,
指向视图中的行(app / views / posts / archives.html.erb)
<% for post in @posts %>
<tr>
<td><%=h post.title %></td>
...
</tr>
<% end %>
所以我的理解是来自控制器动作<% for post in @posts %>
中的实例变量的数据没有传递到视图中,因此我没有发布帖子数组。我正在寻找原因,以及我做错了什么。
(当然,如果我把
archives
之前的
<% @posts = Post.find(:all) %>
在视图中,它的工作正常,但我知道这不是我应该做的。
非常感谢所有的帮助,指导教程的链接等等。
(我很怀疑这很简单,但我使用的是Rails 2.2.2和Ruby 1.8.6。)
答案 0 :(得分:2)
这是正确的:
respond_to do |format|
format.html { render :layout => 'posts' }
format.xml { render :xml => @posts }
end
end
视图无法识别@posts,因为它是在渲染视图后实例化的。 'render'应该是动作中最后执行的行。