0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

投稿リマインド機能

Last updated at Posted at 2026-01-10

ゴール

連続で投稿がなされていないときに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モデルに以下のコードを記入してください。

app/model/tweet.rb
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コントローラーに以下のコードを記入してください。

app/controller/tweets_controller
    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"○○"」によってどの分岐を通ったかがわかります。
下にフローチャートを示します。
スクリーンショット 2025-04-23 195828.png

回数が増える場合の分岐の表示

連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続しているので3に「回数が増えたよ!」が返ってくる。
スクリーンショット 2025-04-23 204121.png

1回目に戻る場合の分岐の表示

連続判定が無事始まったので1に「始まったよー!!」→同じ日に投稿した?で違う日に投稿しているので2に「同日投稿判定を潜り抜けたよ!」→前回投稿した日と今回投稿した日が連続かどうかを判定。連続していないので3に「1回目だよ!」が返ってくる。
スクリーンショット 2025-04-23 204229.png

警告文を表示したいページ(今回の場合はtweetscontrollerを用いるページ)に以下の形でif文を記入してください。

app/views/tweets/○○.html.erb
<% if current_user.kaisuu == 1 %>
<h1>前日の投稿がされていません
今日投稿してみませんか</h1>
<% else %>
現在の連続投稿回数 <%= current_user.kaisuu %>
#もしあなたが投稿の連続回数を表示したい場合はこれを記入してください。
<% end %>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?