Ruby on rails 在rails中渲染局部对象。为资源指定分部会产生错误,但不指定分部则可以。有什么好处?

Ruby on rails 在rails中渲染局部对象。为资源指定分部会产生错误,但不指定分部则可以。有什么好处?,ruby-on-rails,renderpartial,partials,Ruby On Rails,Renderpartial,Partials,我现在很偶然地做到了这一点,但当我明确指定要用于呈现资源的部分时,我不明白是什么导致它中断。有人能解释一下吗 my Posts controller的索引模板包含以下行,这给了我一个错误: <%= render partial: 'posts', collection: @posts %> 错误(在我的浏览器中)显示: NoMethodError-in-Posts#index 显示/Users/applebum/Sites/rails_projects/eventful2/ap

我现在很偶然地做到了这一点,但当我明确指定要用于呈现资源的部分时,我不明白是什么导致它中断。有人能解释一下吗

my Posts controller的索引模板包含以下行,这给了我一个错误:

<%= render partial: 'posts', collection: @posts %>

错误(在我的浏览器中)显示:

NoMethodError-in-Posts#index
显示/Users/applebum/Sites/rails_projects/eventful2/app/views/posts/_posts.html.erb,其中第1行出现:
未定义的方法'any'#
提取的源(第1行附近):
1: 
2:  
三:
4:          
将问题行更改为

<%= render @posts %>

使错误消失,帖子出现(以适当部分的标记很好地显示),正如我所希望和期望的那样

这里是my_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.comments%>
以及它所指的_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">&bull; <%= 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>

:delete,remote:true,:class=>“delete”,:confirm=>“确实要删除此帖子吗?”,:title=>post.content%>
&公牛;以前
  • 分享
以及来自控制器的相关位:

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
class PostsController
有人能解释一下这里发生了什么事吗?我在rubyonrails.org的布局和渲染指南中找不到任何内容


谢谢

您的错误来自于假设
:collection
@posts
在渲染时的含义相同。发件人:

分部在呈现集合时非常有用。通过:collection选项将集合传递给分部时,将为集合中的每个成员插入一次分部

因此,如果您使用它,对于每个帖子,您将执行
post.any?
操作,该操作失败,因为
any?
不是为单个帖子定义的

从相同的文档中,您应该检查render是否返回Nil,以查看集合是否为空:

<h1>Posts</h1>
<%= render(@posts) || "There are no posts." %>
帖子
PD:使用局部渲染仅渲染一篇文章,而不是所有文章


GL&HF。

Ohhh现在我明白了。是你的警察干的D谢谢!
<h1>Posts</h1>
<%= render(@posts) || "There are no posts." %>