在轨道中渲染部分。指定资源的partial会产生错误,但不指定部分工作正常。是什么赋予了?

时间:2014-01-27 12:43:53

标签: ruby-on-rails renderpartial partials

我现在很意外地工作了,但是当我明确指出要用于渲染资源的部分时,我不明白是什么导致它破坏。谁能解释一下呢?

我的帖子控制器的索引模板包含以下行,这给了我一个错误:

<%= 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">&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>

来自控制器的相关位:

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的“布局和渲染”指南中找不到任何内容。

谢谢!

1 个答案:

答案 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。