2016-08-08 5 views
0

私はRailsが初めてです。in_group_of postsループでユーザーのアバターを取得するにはどうすればよいですか? Rails 4

私は投稿ユーザーです。ユーザーhas_many投稿と投稿belongs_toユーザー。

次のコードを実行すると、同じユーザーのアバターを3回取得します。

ただし、各ユーザーには独自のアバターがあります。 各ユーザーの正しいユーザーのアバターをdivカードに登録するにはどうすればよいですか?

<% @Posts.limit(3).in_groups_of(3, false).each do |group| %> 
    <div class="row"> 
     <% group.each do |post| %> 
     <div class="col-xs-12 col-sm-4"> 
     <% @user.limit(1).each do |user| %> 
     <div class="card"> 
      <img src="<%= user.image.url(:thumb) %>" alt="<%= user.name %>" class="avatar-small card-user"> 
      <% end %> 
      <div class="card-description"> 
      <a href="<%= posts_path(post.slug) %>"><h3><%= post.title %></h3></a> 
      <p><%= post.subtitle %></p> 
      </div> 
     </div></a> 
     </div> 
    <% end %> 
    </div> 
<% end %> 

私のコントローラ:

class PagesController < ApplicationController 
    def index 
    @Posts = Post.all 
    @user = User.all 
    end 
end 

schema.rb:私はペーパークリップを使用して宝石を管理

create_table "users", force: :cascade do |t| 
    t.string "name" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    t.string "image_file_name" 
    t.string "image_content_type" 
    t.integer "image_file_size" 
    t.datetime "image_updated_at" 
    end 

    create_table "posts", force: :cascade do |t| 
    t.string "title" 
    t.text  "description" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    t.string "image_file_name" 
    t.string "image_content_type" 
    t.integer "image_file_size" 
    t.datetime "image_updated_at" 
    t.integer "user_id" 
    t.string "slug" 
    t.string "subtitle" 
    end 

ありがとうございました。 もっと情報が必要な場合は教えてください。

+0

を.includes(:users).limit(3)そしてすべての投稿には独自のユーザーがあります。 – Milind

答えて

0

各投稿の正しいユーザーを取得するには、post.user.img_urlを実行します。だからあなたの例では、次のように動作するはずです。 @usersを繰り返し処理する必要がないことに注目して、post.userという関連付けを使用して、その投稿に属するユーザーを見つけることができます。

<% @Posts.limit(3).in_groups_of(3, false).each do |group| %> 
<div class="row"> 
    <% group.each do |post| %> 
    <div class="col-xs-12 col-sm-4"> 
    <div class="card"> 
     <img src="<%= post.user.image.url(:thumb) %>" alt="<%= user.name %>" class="avatar-small card-user"> 
     <div class="card-description"> 
     <a href="<%= posts_path(post.slug) %>"><h3><%= post.title %></h3></a> 
     <p><%= post.subtitle %></p> 
     </div> 
    </div></a> 
    </div> 
<% end %> 

+0

サイドノートとして、コントローラコードについて考えてみてください。 Loading Post.allはあまり効率的ではありません.100万以上の投稿があるとします。あなたはそのようなものをすべてロードしたくないでしょう。また、インスタンス変数の場合、 "@Posts"は "@posts"になるように、小文字だけを使用してください。 –

+0

ご協力ありがとう@SimonKnight!あなたの答えのおかげで、すべての作品は今!しかし、 '@ posts'と' @ Posts'の違いは何ですか? –

0

問題は、コントローラで、あなたのコード..です

  1. まず、あなたはポストを取得し、その後、第二に
  2. あなたのビューでそれをループし、再度フェッチされていますあなたはそれぞれの投稿のユーザーが望むように、あなたは投稿と一緒にやっていたはずだった別々のユーザー...

のでideally..youのような何かを試みなければならない: - :@post =ポストあなたのようなこのproblem..try何かを避けるために熱心な負荷にしようとしていけない理由は役立ちます

##this will give all post and their respective users 
@posts = Post.includes(:users).limit(3) 

##in your view 

    <%if @posts.present?%> 
    <%@posts.each do |post|%> 
     <%= post.message%> 
     <%= image_tag(post.user.avatar_url)%> 
    <%end%> 
    <%end%> 

はHOPE :)

+0

あなたの答えのおかげで@Milind、実際に私は '<%= user.image.url(:thumb)%>'を<%= post.user.image.url(:thumb)%> 'で置き換え、 <%@ user.limit(1).each do | user | %> '私のコントローラでは、@Posts = Post.allを@Posts = Post.last(3)に置き換えます。それは今働きます! –

+0

@ Florian_CEO..Sounds good.Let私の答えが役に立つかどうかを知っている:) – Milind

関連する問題