yuka-mm / promise_recorder

PF
1 stars 0 forks source link

通知機能について #12

Closed yuka-mm closed 8 months ago

yuka-mm commented 9 months ago

現在の状況

Rakeとclone、wheneverを使用し通知機能を実装したいです。 Rakeとschedule.rbは下記のように記述ました。

namespace :reward do
  desc 'Send task achievement rewards'
  task send_reward: :environment do
    # 現在の日付を取得
    today = Date.today
    puts "Today is #{today}"

    Child.find_each do |child|
      # 子ユーザーに関連するPaydayとRewardが存在するかをチェック
      next unless child.payday.present? && child.rewards.present?
      puts "Processing child #{child.id}"

      # 子ユーザーに関連するPaydayを取得
      payday = child.payday

      # ユーザーが設定した通知日と現在の日付が一致しているか確認
      next unless payday.date == today.day || Payday.weeks[payday.week] == today.wday || (payday.end_month && today.end_of_month)
      puts "child #{child.id} because payday or rewards are missing"

      # 累計ポイントを取得
      point_sum = child.monthly_points
      puts "Points for child #{child.id}: #{point_sum}"

      # Rewardを取得
      reward_by_pieces = child.rewards.where('pieces <= ?', point_sum).order(pieces: :desc).first
      reward_by_pt_range = child.rewards.where('pt_range <= ?', point_sum).order(pt_range: :desc).first
      reward = reward_by_pieces || reward_by_pt_range || child.rewards.first
      puts "Reward for child #{child.id}: #{reward}"

      # 通知文作成
      message = if point_sum.nil? || point_sum <= 0
                  "まだタスクを達成していません。次は頑張ろう💪‼️"
                else
                  if reward
                    if reward.pieces.present? && reward_by_pieces
                      "#{point_sum}こ守れたので#{reward_by_pieces.body}GET✨\nおめでと〜〜〜🎉👏"
                    elsif reward.pt_range.present? && reward_by_pt_range
                      "#{point_sum}ポイント達成したので#{reward_by_pt_range.body}GET✨\nおめでと〜〜〜🎉👏"
                    else
                      "#{reward.body}#{point_sum}#{reward.pt_addition}分GET✨\nおめでと〜〜〜🎉👏"
                    end
                  end
                end

      # 親ユーザーに通知
      case payday.action_type
      when 'mail_type'
        # 親ユーザーにメール送信
        ParentMailer.achievement_notification(child.parent, child, message).deliver_now
      when 'line_type'
        # 親ユーザーにライン送信
        PushLineJob.perform_later(child, message)
      when 'not_set'
        next
      end

      # monthly_pointsのリセットとcompletedのリセット
      child.update(monthly_points: 0)
    end
  end
end
require File.expand_path(File.dirname(__FILE__) + '/environment')

env :PATH, ENV['RBENV_ROOT'] ? "#{ENV['RBENV_ROOT']}/shims:#{ENV['PATH']}" : ENV['PATH']

rails_env = ENV['RAILS_ENV'] || :development
set :environment, rails_env
set :output, "#{Rails.root}/log/cron.log"
set :timezone, 'Asia/Tokyo'

every 1.day, at: '9:00 am' do
  rake 'reward:send_reward'
end

時間になっても通知が送られてこないため、logを確認すると下記のように表示されていました

/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.5.6) required by your /Users/kubosugiyuka/workspace/promise_recorder/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.5.6`
    from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
    from /usr/bin/bundle:23:in `<main>'

Rubyのバージョンは3.2.2を使用しているのですが、なぜか2.6が表示されており、同じエラーが続いています。

試したこと

・最初、Ruby側のバージョンが違うことに気がつかず、指示にある通りbundle update --bundlerと、gem install bundler:2.5.6を行いました。最初2.5.4が見つかりませんと出ていたのがupdateしたことで2.5.6になったもののエラーの内容は変わらずでした。 ・以下記事を見つけることができなかったのでGTPに聞きながら試した内容です

# パスの確認
% gem environment
GEM PATHS:
- .rbenv/versions/3.2.2/lib/ruby/gems/3.2.0
- .gem/ruby/3.2.0

% which bundle
.rbenv/shims/bundle

# Rubyと、それに対応するgemのバイナリのシムリンクを作り直して確認
%rbenv rehash
%bundle env
Bundler       2.5.6
  Platforms   ruby, arm64-darwin-22
Ruby          3.2.2p53 (2023-03-30 revision e51014f9c05aa65cbf203442d37fef7c12390015) [arm64-darwin-22]
  Full Path   /***/.rbenv/versions/3.2.2/bin/ruby
  Config Dir  /***/.rbenv/versions/3.2.2/etc
RubyGems      3.5.3
  Gem Home    /***/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0
  Gem Path    /***/.gem/ruby/3.2.0:/***/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0
  User Home  ***
  User Path   /***/.gem/ruby/3.2.0
  Bin Dir     /***/.rbenv/versions/3.2.2/bin

「Ruby自体のバージョンは3.2.2である一方、Gemのパスには3.2.0が指定されているようです。これは通常とは異なる状況で、RubyのバージョンとGemのパスは一致するべきです。 このような問題は、Rubyのバージョンアップ後に古いバージョンのGem設定が残ってしまっている場合などに発生することがあります。この問題を解決するためには、Gemの設定をリセットする必要があります。」

とのことで、バックアップをとり以下の流れを行う

%gem update --system
Updating rubygems-update
Fetching rubygems-update-3.5.6.gem
Successfully installed rubygems-update-3.5.6
Parsing documentation for rubygems-update-3.5.6
Installing ri documentation for rubygems-update-3.5.6
Done installing documentation for rubygems-update after 0 seconds
Parsing documentation for rubygems-update-3.5.6
Done installing documentation for rubygems-update after 0 seconds
Installing RubyGems 3.5.6
Successfully built RubyGem
Name: bundler
Version: 2.5.6
File: bundler-2.5.6.gem
Bundler 2.5.6 installed
RubyGems 3.5.6 installed
Regenerating binstubs
Regenerating plugins
Parsing documentation for rubygems-3.5.6
Installing ri documentation for rubygems-3.5.6

%bundle env
Bundler       2.5.6
  Platforms   ruby, arm64-darwin-22
Ruby          3.2.2p53 (2023-03-30 revision e51014f9c05aa65cbf203442d37fef7c12390015) [arm64-darwin-22]
  Full Path   /***/.rbenv/versions/3.2.2/bin/ruby
  Config Dir  /***/.rbenv/versions/3.2.2/etc
RubyGems      3.5.3
  Gem Home    /***/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0
  Gem Path    /***/.gem/ruby/3.2.0:/***/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0
  User Home  ***
  User Path   /***/.gem/ruby/3.2.0
  Bin Dir     /***/.rbenv/versions/3.2.2/bin

# Gemのパスが3.2.0と表示されているので入れ直す
%rbenv uninstall 3.2.2
%rbenv install 3.2.2
%rbenv global 3.2.2
%gem install bundler
%bundle install
%ruby -v 
3.2.2
%rails -v
rbenv: rails: command not found
%gem install rails
%rails -v
7.1.3

#Gemfileには7.1.2となっているため、7.1.3をアンインストールして入れ直そうとしましたがうまくいかず、Gemfile側を直しました
% gem uninstall rails
Successfully uninstalled rails-7.1.3

% rails -v
Rails 7.1.3

% gem install rails -v 7.1.2
Fetching activesupport-7.1.2.gem
Fetching activemodel-7.1.2.gem
Fetching railties-7.1.2.gem
Fetching actionpack-7.1.2.gem
Fetching actionview-7.1.2.gem
Fetching activerecord-7.1.2.gem
Fetching activejob-7.1.2.gem
Fetching activestorage-7.1.2.gem
Fetching actiontext-7.1.2.gem
Fetching actionmailer-7.1.2.gem
Fetching actionmailbox-7.1.2.gem
Fetching actioncable-7.1.2.gem
Fetching rails-7.1.2.gem
Successfully installed activesupport-7.1.2
Successfully installed actionview-7.1.2
Successfully installed actionpack-7.1.2
Successfully installed railties-7.1.2
Successfully installed activemodel-7.1.2
Successfully installed activerecord-7.1.2
Successfully installed activejob-7.1.2
Successfully installed activestorage-7.1.2
Successfully installed actiontext-7.1.2
Successfully installed actionmailer-7.1.2
Successfully installed actionmailbox-7.1.2
Successfully installed actioncable-7.1.2
Successfully installed rails-7.1.2
13 gems installed

% rails -v
Rails 7.1.3

%gem uninstall rails -v 7.1.3
Gem 'rails' is not installed

% gem uninstall rails
Successfully uninstalled rails-7.1.2
% gem uninstall rails
Gem 'rails' is not installed

% rails -v
7.1.3

%gem install rails
%rails -v
7.1.3

解決したいこと

・これまでの操作でbundle exec rake reward:send_rewardコマンドでRakeを実行しようとした時warningが出てしまっていています

/Users/kubosugiyuka/workspace/promise_recorder/vendor/bundle/ruby/3.2.0/gems/activesupport-7.1.3/lib/active_support/current_attributes.rb:95: warning: already initialized constant ActiveSupport::CurrentAttributes::INVALID_ATTRIBUTE_NAMES
/Users/kubosugiyuka/workspace/promise_recorder/vendor/bundle/ruby/3.2.0/gems/activesupport-7.1.3/lib/active_support/current_attributes.rb:95: warning: previous definition of INVALID_ATTRIBUTE_NAMES was here

ファイルを辿ってみて、7.1.2と7.1.3の2種類のファイルが出来上がってしまっている状態なのですが、できれば7.1.2のバージョンを使用したい場合、7.1.3のファイルを手動で削除し、rails7.1.2自体をインストールし直せば直るでしょうか?

・下記のclone実行部分のエラーで他にどんな対策があるでしょうか

/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.5.6) required by your /Users/kubosugiyuka/workspace/promise_recorder/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.5.6`
    from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
    from /usr/bin/bundle:23:in `<main>'

以上2点よろしくお願いします。

kenchasonakai commented 9 months ago

Herokuなどデプロイ先によってはwheneverを使用せずにデプロイ先のサービスによってcronの機能が使えるものがありますのでまずはそちらを利用できないか調べてみると良いかもです

https://reasonable-code.com/heroku-cron/

yuka-mm commented 8 months ago

Fly.ioで同じようなものを調べてみたのですがわからなかったので、補足でいただいた通り質問を調べてみて解決しました!

require File.expand_path(File.dirname(__FILE__) + '/environment')

set :job_template, "/bin/zsh -l -c ':job'"
job_type :rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && RAILS_ENV=:environment bundle exec rake :task :output"

schedule.rb側でパスを通したところ無事起動しました。 ありがとうございました!