会員サイトなどで期限つきの有料プランがあるサービスは最近たくさんあります。
イメージで言うとAmazon PrimeとかNetfixなどですね。
こういう類のサイトを利用していると、
「あと〜日で期限が切れます。」
「あと〜日でポイントが無効になります。」
などのメッセージが届きますよね。
これをrailsでも実装したい場合はどうしたら良いのかというお話。(実際にコードは書いていません。方向性を示しています。)
そのためには、代表的なgemでwheneverというものを使ってみたいと思います。
gem 'whenever', require: false
このgemをbundleインストールしたら以下を実行しましょう。
$ bundle exec wheneverize .
すると、config/schedule.rbが作成されます。
そして、このファイルに定期実行したい処理や期間を記述していけばOKです。
例えば、以下のように書くことで1日おきにrakeタスクを実行できます。
これはauto_renewタスクを実行しています。
# day以外にも 1.minute, :hour, :day, :month, :year, :reboot :weekend, :weekdayなどがある。
every 1.day do
rake 'auto_renew'
end
もし、ディレクトリ配下にある場合は、以下のようになります。
# day以外にも 1.minute, :hour, :day, :month, :year, :reboot :weekend, :weekdayなどがある。
every 1.day do
rake 'directory:auto_renew'
end
rakeタスクを作成するためには、以下のコマンドでauto_renewというタスクを作成します。
$ rails g task auto_renew
すると、rakeファイルが
./lib/task/配下に作成されます。
そして、以下のように記述していきます。
もしtasksディレクトリ直下にある場合は、namespaceは不要です。(今後、たくさんタスクをこのファイルに作成していくのであれば、管理しやすいようにnamespaceをつけても良いです。)
# descはタスクの説明を書けば良いです。
desc 'autorenewを作成してみました。'
# taskの実行時の名前をつけます。:environmentと記述すると実際の環境で実行できます。
task auto_renew: :environment do
#実行したいコマンドをここに入力
end
ディレクトリ直下ではなく、
tasks/directory/test.rake
のようになっている場合は、namespaceが必要で以下のようになります。
namespace :directory do
desc 'autorenewを作成してみました。'
task auto_renew: :environment do
#実行したいコマンドをここに入力
end
end
最後に以下のコマンドを実行すれば、このファイルの設定を読み込みます。
#ターミナル
$ bundle exec whenever --update-crontab
実行の取り消しは以下の通り。
#ターミナル
$ bundle exec whenever --clear-crontab
以上になります。
cronを使っても良いですが、wheneverを使うと簡単に実装できますね。
あとはどんなタスクを実行したいか、どのように記述するかを考えていくことが中心になるかと思います。
有効期限などに応じて、メールやメッセージを送るにはどうすれば良いのか、検討したいと思います。
補足説明
taskファイルを作成して、descという記述がありましたが、
以下のコマンドを実行すると現在のタスク一覧を表示できるのですが、
bundle exec rake -T
その際に以下のように説明がタスク名と一緒に表示されます。
ですので、後から他の人が見てわかりやすいような説明を入れておくと良いです。
rake autorenew # autorenewを作成してみました。
#ちなみにディレクトリ配下の場合は以下のようになります。
rake directory:autorenew
タスクは以下のコマンドで実行できるので、作成してうまくできているか試してみましょう。
もしタスク名に何を入れればよいか分からない場合は、先ほどのタスク一覧で確認できます。
$ bundle exec rake タスク名