ゴール
連続で投稿がなされていないときにview上で投稿を促すリマインド文を表示する
開発環境
tweetsController,TweetModel,tweetsテーブル,UserModel,usersテーブル
GeekSalonの教材5-2まで完了していることを前提にしています。
事前準備
usersテーブルにkaisuuカラム(連続投稿回数を記録するためのカラム)とlast_tweeted_date(最後にツイートした日を保存するためのカラム)、remind_date(今日の日付を記録するカラム)の3つを追加してもらいます。
rails generate migration AddKaisuuToUsers kaisuu:integer
#usersテーブルにkaisuuカラム(連続投稿回数を記録するためのカラム)を追加
rails generate migration AddLast_tweeted_dateToUsers last_tweeted_date:date
#usersテーブルにlast_tweeted_date(最後にツイートした日を保存するためのカラム)を追加
rails generate migration AddRemind_dateToUsers remind_date:date
#usersテーブルにremind_date(今日の日付を記録するカラム)を追加
rails db:migrate
#マイグレーションを実行
実装
tweetモデルに以下のコードを記入してください。
class Tweet < ApplicationRecord
belongs_to :user
after_create :renzoku_hantei
#投稿を作成したのちにrenzoku_hanteiを実行する。
#↓がrenzoku_hanteiの中身
private
def renzoku_hantei
puts "始まったよー!!"
user = self.user
today = user.remind_date
toukoubi = created_at.to_date
last_date = user.last_tweeted_date
return if last_date == today
#user.last_tweeted_dateがremind_date(今日の日付)と同じならカウントしない。同日に複数投稿してる場合にこの後の処理を全部なしにする。
puts "同日投稿判定を潜り抜けたよ!"
if last_date == today - 1
#user.last_tweeted_date(前回投稿した日)がremind_date(今日の日付)より1低かったら(:例16日に投稿、前回の投稿は15日)なら~
new_kaisuu = user.kaisuu.to_i + 1
puts "回数が増えたよ!"
else
puts "1回目だよ!"
new_kaisuu = 1
end
# kaisuuカラムにニュー回数を代入、last_tweeted_date(前回投稿日)にtoukoubi(今回投稿した日)を代入。
user.update!(
kaisuu: new_kaisuu,
last_tweeted_date: today
)
end
end
tweetコントローラーに以下のコードを記入してください。
after_action :kakuninn, only:[:index]
def kakuninn
user = current_user
time = Time.now
jtime = Time.at(time, in: "+09:00")
user = current_user
if user.last_tweeted_date == nil
user.update!(last_tweeted_date: 0)
end
user.update!(
remind_date: jtime
)
end
end
今回は実装がうまく行っているかどうかのテストのためにputsを用いてそれぞれの分岐で文章を出力させています。
うまく行っているかのテストの仕方
普通に投稿してテストをやろうとすると、created_atとupdated_atを設定できないので1回テストをするだけで2日かかってしまいます。そこでrails cをしてコンソールから直接投稿をしていくことにします。
rails c
u = User.create!(name: "test_user", email:"あなたのメールアドレス", password:"お好きなパスワードを入れてください", kaisuu: 0, last_tweeted_date: nil)
#新しいユーザーを作成してuに代入する。
u = User.first
#user_idが1のプレイヤーをuに代入する。
#注意!上のuにユーザーを代入する作業はどちらか1回で行ってください!
u.sindans.create!(name: "iti", created_at: Date.new(2025, 4, 16), updated_at: Date.new(2025, 4, 16))
#1個目のテスト投稿。created_atとupdated_atはテストをする日の日付に合わせてください
u.reload.kaisuu
#kaisuuカラム(連続投稿回数を記録するためのカラム)の中身を出力、これを押した時にputsが出力される。
u.sindans.create!(name: "ni", created_at: Date.new(2025, 4, 17), updated_at: Date.new(2025, 4, 17))
#2個目のテスト投稿。created_atとupdated_atはテストをする日の次の日付に合わせてください
u.reload.kaisuu
#kaisuuカラム(連続投稿回数を記録するためのカラム)の中身を出力、これを押した時にputsが出力される。
u.sindans.create!(name: "san", created_at: Date.new(2025, 4, 19), updated_at: Date.new(2025, 4, 19))
#3個目のテスト投稿。created_atとupdated_atは2個目の日付と連続していない日付に設定してください。
上の方法でテストを行った場合、「u.reload.kaisuu」を行うたびに「puts"○○"」によってどの分岐を通ったかがわかります。
下にフローチャートを示します。

回数が増える場合の分岐の表示
連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続しているので3に「回数が増えたよ!」が返ってくる。

1回目に戻る場合の分岐の表示
連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続していないので3に「1回目だよ!」が返ってくる。

警告文を表示したいページ(今回の場合はtweetscontrollerを用いるページ)に以下の形でif文を記入してください。
<% if current_user.kaisuu == 1 %>
<h1>前日の投稿がされていません!
今日投稿してみませんか?</h1>
<% else %>
現在の連続投稿回数 <%= current_user.kaisuu %>回
#もしあなたが投稿の連続回数を表示したい場合はこれを記入してください。
<% end %>