通过实例变量将数据从控制器传递到视图,我做错了什么?

时间:2009-05-29 21:43:52

标签: ruby-on-rails

我正在尝试编写我的第一个自定义控制器操作并遇到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。)

1 个答案:

答案 0 :(得分:2)

这是正确的:

  respond_to do |format|
    format.html { render :layout => 'posts' }
    format.xml { render :xml => @posts }
  end
end

视图无法识别@posts,因为它是在渲染视图后实例化的。 'render'应该是动作中最后执行的行。