как показать имя пользователя с соответствующими сообщениями? - PullRequest
1 голос
/ 31 октября 2019

Я собирал приложение для рельсов. Я хочу, чтобы все сообщения на странице. Я могу показать заголовок и текст сообщения, но не могу указать имя пользователя (кому принадлежит сообщение - владелец сообщения).

Постмодель

class Post < ApplicationRecord
    belongs_to :user
end

Модель пользователя

class User < ApplicationRecord
    has_many :posts
end

Контроллер постов

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

Просмотр постов 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 %>

Схема выглядит как

 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

Отображаемое имяпользователя, разместившего это сообщение

Ответы [ 3 ]

0 голосов
/ 31 октября 2019

Поскольку у вас есть отношение к User в Post как belongs_to :user, поэтому вы можете просто использовать post.user.name, чтобы получить имя 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 %>

бонус

Если вы хотите загружать пользователя в одном запросе, который вы можете использовать. Post.includes(:user).all, это лучше, если вы всегда используете пользователя, сохраняет ваш дополнительный запрос. Имейте в виду, что у него есть и свои недостатки.

0 голосов
/ 31 октября 2019

Это довольно легко получить доступ. Попробуйте post.user.name, и вы получите name ассоциированного user.

Узнайте здесь обо всех стандартных методах, доступных для belongs_to ассоциации https://guides.rubyonrails.org/association_basics.html#methods-added-by-belongs-to

0 голосов
/ 31 октября 2019

Попробуйте post.user, чтобы получить user объект. Затем вы можете распечатать любой атрибут из объекта user.

<p><%= post.user.name %></p>

и использовать метод includes, чтобы избежать проблемы с N + 1 запросами.

def index
  @posts = Post.includes(:user)
end  

Ссылка: https://guides.rubyonrails.org/active_record_querying.html

...