我现在很意外地工作了,但是当我明确指出要用于渲染资源的部分时,我不明白是什么导致它破坏。谁能解释一下呢?
我的帖子控制器的索引模板包含以下行,这给了我一个错误:
<%= render partial: 'posts', collection: @posts %>
错误(在我的浏览器中)说:
NoMethodError in Posts#index
Showing /Users/applebum/Sites/rails_projects/eventful2/app/views/posts/_posts.html.erb where line #1 raised:
undefined method `any?' for #<Post:0x000001064b21f0>
Extracted source (around line #1):
1: <% if posts.any? %>
2: <div id="posts">
3: <% posts.each do |post| %>
4: <%= render partial: "posts/post", locals: { post: post } %>
将问题行更改为
<%= render @posts %>
使错误消失,帖子出现(很好地显示在相应部分的标记中),正如我所希望的那样。
这是我的_posts.html.erb部分:
<% if posts.any? %>
<div id="posts">
<% posts.each do |post| %>
<%= render partial: "posts/post", locals: { post: post } %>
<% # render :partial => "comments/comments", :collection => post.comments %>
<% end %>
</div>
<% end %>
如果重要的话,_post.html.erb部分是指的:
<div class="post" id="post_<%= "#{post.id}" %>">
<div class="post_inner">
<%= link_to avatar_for(post.user, size: "small"), post.user.profile %>
<div class="post_body">
<div class="user-tools">
<% if can? :destroy, post %>
<%= link_to '<i class="fi-x"></i>'.html_safe, post, :method => :delete, remote: true, :class => "delete", :confirm => "Are you sure you want to delete this post?", :title => post.content %>
<% end %>
</div>
<h5 class="username">
<%= link_to post.user.name, post.user.profile %>
<span class="timestamp">• <%= time_ago_in_words(post.created_at) %> ago</span>
</h5>
<div class="content">
<%= post.content %>
</div>
<ul class="foot">
<li>Like<li>
<li>Share</li>
</ul>
</div>
</div>
</div>
来自控制器的相关位:
class PostsController < ApplicationController
respond_to :html, :js # Allow for AJAX requests as well as HTML ones.
before_filter :load_postable
load_and_authorize_resource
def index
@post = Post.new
@posts = @postable.posts
end
private #################
def load_postable
klass = [User, Event].detect { |c| params["#{c.name.underscore}_id"] } # Look for which one of these there's a ***_id parameter name for
@postable = klass.find(params["#{klass.name.underscore}_id"]) # Call find on that, passing in that parameter. eg Event.find(1)
end
有谁可以向我解释这里发生了什么?我在rubyonrails.org的“布局和渲染”指南中找不到任何内容。
谢谢!
答案 0 :(得分:1)
您的错误来自于假设:collection
和@posts
在渲染时的意思相同。来自Rails Docs (point 3.4.5):
部分在渲染集合时非常有用。当您通过:collection选项将集合传递给partial时,将为集合中的每个成员插入一次部分
因此,如果您使用该帖子,则对于每个帖子,您将执行post.any?
失败,因为没有为单个帖子定义any?
。
在相同的文档中,您应该检查渲染是否返回Nil以查看该集合是否为空:
<h1>Posts</h1>
<%= render(@posts) || "There are no posts." %>
PD:使用partial来只渲染一个帖子,而不是所有帖子。
GL&amp; HF。