2014-01-27 4 views
0

저는이 작업이 지금 당장 우연히 일어나고 있습니다 만, 리소스를 렌더링하기 위해 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 %> 

오류가 사라지고 게시물이 표시됩니다 (멋지게 표시됨). 적절한 부분으로부터의 마크 업에서).

<% 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> 

을 그리고 컨트롤러에서 해당 비트

여기 내 부분 _posts.html.erb입니다 :

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

렌더링 할 때 :collection@posts이 같은 것을 의미한다고 가정하면 오류가 발생합니다. Rails Docs (point 3.4.5)에서 :

Partials are very useful in rendering collections. When you pass a collection to a partial via the :collection option, the partial will be inserted once for each member in the collection

그래서, 당신은, 각 게시물에 대한 당신이 any?으로 실패 post.any?을하고있을 것이다하는 것은 하나의 게시물에 대한 정의되지 않은 것을 사용하는 경우. 수익을 렌더링하면 같은 문서에서

, 당신은 컬렉션이 비어있는 경우 무기 호를 확인해야합니다 :

<h1>Posts</h1> 
<%= render(@posts) || "There are no posts." %> 

PD를 : 하나의 게시물이 아니라 그들 모두를 렌더링하는 부분을 사용합니다.

gl & HF.

+0

오우 이제 알겠습니다. 네 PD가 해냈어. : D 고마워! – Reb