2020年5月5日火曜日

簡易SNSを作ってみよう(8)

投稿を表示できるようにする
生徒ユーザーの各ページで,コメントを投稿,表示できるようにする.
投稿モデルの作成
投稿のコメントを表すモデルとして,Userモデルに紐づくPostモデルを作成する.dependent属性を付け,ユーザーが削除されたときはそれに紐付いているコメントは全て削除されるようにする.

【手順】
bin/rails g model post user_id:integer body:text
bin/rails db:migrate
vi app/models/user.rb
(以下を追記)
class User < ApplicationRecord
  has_many :posts, dependent: :delete_all
  # …
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  def email_required?
    false
  end
end

vi app/models/post.rb
(以下を追記)
class Post < ApplicationRecord
  belongs_to :user
end
投稿の表示
投稿されたコメントを表示できるようにする.

【手順】
vi app/controllers/users_controller.rb
(以下を追記)
class UsersController < ApplicationController
  before_action :authenticate_user!

  def show
    @user = User.find(params[:id])
    @students = User.where(role: 'student') if @user.role == 'teacher'
    @posts = Post.where(user_id: @user.id).order('created_at desc')
  end
end

vi app/views/users/show.html.erb 
(以下を最後に追記)
<% if @posts != nil %>
   <% l = @posts.length; @posts.each_with_index {|post, i| %>
    <p><%= (l-i).to_s + " : " + post.created_at.to_s %><br /> 
    <%= post.body %></p>
   <% } %>
<% end %>
投稿のテスト
コンソールを用いて,ユーザー(user001)が投稿したという体裁の,テストデータ(ダミーデータ)を挿入する.

【手順】
bin/rails c
irb(main):001:0> u = User.find_by(id: 2)
irb(main):002:0> u.posts.create({ body: "Hello, world!" })
irb(main):003:0> u.posts.create({ body: "こんにちは世界!" })
irb(main):004:0> quit


サーバを起動して異なるユーザーのマイページにアクセスし,投稿済みユーザー(user001と未投稿ユーザー(user002)でマイページが異なることを確認する(先生ユーザーでログインして,リンクを辿ればよい).

0 件のコメント:

コメントを投稿