2020年5月13日水曜日

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

新着アップロードの対応
Teacherロールでログインしたときに,新着アップロードが分かるように修正する.
アップデート順に並べるように変更
生徒の並びをアップデート順番に並べるように変更する.

【手順】
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')
.order('updated_at desc') if @user.role == 'teacher'                               
    @posts = Post.where(user_id: @user.id).order('created_at dssc')
  end
end
メッセージがポストされたときの処理を変更
Teacherロール以外でメッセージがポストされたときにUserのエントリをアップデートするようにする.すなわち,新たに生徒・学生がメッセージをポストしたときは,エントリがアップデートされるため,Teacherロールでログインしたときに先頭に表示されるようになる.
なお,Teacherロールでログインして書き込んだときには,Userエントリは更新されないため,並び順は不変となることに注意されたい.

【手順】
vi app/controllers/posts_controller.rb
(以下を追加)
  def create
    p = post_params
    user = User.find(p[:id])
    if (p[:body] == "")
      flash[:alert] = 'Null comment is not permitted.'
    else
     if user.posts.create(body: p[:body], submitter: current_user.id)
        user.touch if current_user.role != 'teacher'
        flash[:notice] = 'Post was successfully created.'
      else
        flash[:alert] = 'Something went wrong'
      end
    end

    redirect_to user_path(user.id)
  end

Visitモデルの作成
各ページへの参照状況を表すモデルとしてUserモデルに紐づくVisitモデルを作成する.dependent属性を付け,ユーザーが削除されたときはそれに紐付いているVisitのエントリは全て削除されるようにする.
【手順】
bin/rails g model visit user_id:integer visitee:integer
bin/rails db:migrate
vi app/models/user.rb
g(以下を追記)
class User < ApplicationRecord
  has_many :posts, dependent: :delete_all
  has_many :visits, dependent: :delete_all

…(略)…
end

vi app/models/visit.rb
(以下を追記)
class Visit < ApplicationRecord
  belongs_to :user
endTeacher

ページ参照の作成と更新
各ページを参照した記録を残すようにする.current_user.visits.find_by(...) という書き方 current_user.visits << Visit.create(...) という書き方に注意.
vi app/controllers/users_controller.rb
(以下を追記)
 def show
   @user = User.find(params[:id])
   @students = User.where(role: 'student')
.order('updated_at desc')
   @posts = Post.where(user_id: @user.id)
.order('created_at desc')

   visit = current_user.visits.find_by(visitee: @user.id)
   if (visit != nil)
     visit.touch
   else
     current_user.visits << Visit.create(visitee: @user.id)
   end
 end

0 件のコメント:

コメントを投稿