Search code examples
ruby-on-railsruby-on-rails-5.2ruby-on-rails-6

how to show user name with associated posts?


I was building a rails app. I want to all post on a page. I am able to show posts title and body but i am not able users name(to whom post belongs -owner of post).

Post-Model

class Post < ApplicationRecord
    belongs_to :user
end

User-Model

class User < ApplicationRecord
    has_many :posts
end

Posts-Controller

class PostsController < ApplicationController
    def index
        @posts = Post.all
    end   
end

Posts-View index.html.erb

<h1> All article </h1>
<% @posts.each do |post| %>
    <ul>
    <div class="row">
      <div class="col-md-offset-3 col-md-5">
         <h5><b><%= post.title %></b> by <%=  %></h5>
         <p><%= post.body %></p>
      </div>
    </div>
    </ul>
<% end %>

Schema looks like

 create_table "posts", force: :cascade do |t|
    t.string "title"
    t.text "body"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

Display name of user who posted that post


Solution

  • Since you have a relation to the User in the Post as belongs_to :user, So, you can simply use post.user.name to get the name of the user like.

    <h1> All article </h1>
    <% @posts.each do |post| %>
        <ul>
        <div class="row">
          <div class="col-md-offset-3 col-md-5">
             <h5><b><%= post.title %></b> by <%=  post.user.name %></h5>
             <p><%= post.body %></p>
          </div>
        </div>
        </ul>
    <% end %>
    

    bonus

    If you want to eager load the user in a single query you might wanna use. Post.includes(:user).all, its better if you always use the user, saves you extra query. Mind that it has some downsides to it as well.