ruby-on-rails:在列表中的每个项目上呈现部分内容

时间:2009-10-08 19:57:38

标签: ruby-on-rails

我在视图(.html.erb)中有以下内容:

<% @posts = GetAllPostsFunctions %>   (removed for berivity)

<% @posts.each do |post| %>
<%=  post.title %>

<%= render :partial => "posts/post_show" %>
<% end %>

posts_show partial具有以下内容:

....
<td><%=h @post.title %> </td>

但是我收到以下错误

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.title

有什么想法吗?

4 个答案:

答案 0 :(得分:17)

您还可以使用:collection for render:partial来简单地完成任务。它将值的每个项目传递给:集合到共享部分名称的局部变量。

<% @posts = GetAllPostsFunctions %>   (removed for berivity)

<%= render :partial => "posts/post_show", :collection => @posts %>

在这种情况下,Rails将为@posts中的每个项目渲染post_show,并将局部变量post_show设置为当前项目。它还提供了方便的计数器方法。

成功使用此方法需要将app / views / posts / _post_show.html.erb部分重命名为app / views / posts / _post.html.erb或将部分帖子中的每个帖子更改为post_show。如果您将部分重命名为传统的 _post.html.erb ,那么您只需执行以下操作:

<%= render :partial => @posts %>

这将为@posts变量中的每个帖子呈现部分内容。

答案 1 :(得分:7)

由于每个循环中的post变量是一个locale变量,你必须使它可用于partial:

<%= render :partial => "posts/post_show", :locals => {:post => post} %>

然后,您可以通过本地变量帖子访问标题:

<td><%=h post.title %> </td>

您还可以通过将帖子呈现为集合来简化整个过程。有关更多信息,请查看Rails文档:

http://api.rubyonrails.org/classes/ActionController/Base.html#M000658

答案 2 :(得分:0)

看起来你没有设置partial的@post,所以当它去评估partial时,它会得到一个空引用。

或者,确保您的帖子提取功能实际上正在返回

答案 3 :(得分:0)

我不是肯定的,但我认为你必须做到post.title而不是@post.title

对不起,如果我误解了你,我是铁杆新手。