※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
Rakeタスクとは
アプリケーションを起動せず、コマンドラインから実行できるようにするためのもの
rake -T
で登録されているタスクを確認できる
下にもっとたくさん並んでいる
Rakeタスクはいつ使う?
- 定期的に実行したい処理があるとき
- 1日に1回、ユーザーの登録状況をSlackに通知する など
- 運営者がアプリの機能を利用したい場合
- メールのお知らせ機能を運営者が利用する など
Rakeタスクを作成する
利用者にメールを送信するRakeタスクを登録してみる
app/lib/tasks/notification.rakeを作成する
今回はわかりやすく「puts 'はじめての Rake task'
」を入れてみる
namespace :notification do
desc '利用者にメールを送付する'
task send_emails_from_admin: :environment do
puts 'はじめての Rake task'
end
end
この状態でrake -Tを実行してみる
登録できている!
コード | 説明 |
---|---|
namespace | 「rake ●●」に入る |
task | 「rake notification:●●」に入る |
namespace
があると、なにをどうするのかがわかりやすくなる
コードを実行してみると、「puts 'はじめての Rake task'
」が動く
rails notification:send_emails_from_admin
コマンドラインからコードが実行できるようになった
※「puts 'はじめての Rake task'
」は不要なので削除しておく
↓のjobを実行できるようにする
メールが非同期処理で送付されるように定義する
namespace :notification do
desc '利用者にメールを送付する'
task send_emails_from_admin: :environment do
NotificationFromAdminJob.perform_later('rake task test')
end
end
redis、sidekiqが起動していることを確認する
先ほどと同じように実行する
rails notification:send_emails_from_admin
foremanのログを見ると、workerが働いたことがわかる
Letter_openerを見ると、「rake task test」のメールが全ユーザー(4名)に送られている
Rakeタスクに引数を使う
コマンドラインでメール送信する際、引数を使って、本文を自由に変更できるようにしたい
引数を受け取ってputsできるようにしてみる
task :send_emails_from_admin, ['msg'] => :environment do |task, args|
puts args
end
キー['msg'] =>
バリュー:environment
args
とはargumentsの略
arguments・・・引数の英語
'msg'
の引数がargs
に入ってくる
rails notification:send_emails_from_admin\[こんにちは\]
\[こんにちは\]のように、バックスラッシュoption+¥をいれる
task :send_emails_from_admin, ['msg'] => :environment do |task, args|
puts args['msg']
end
ハッシュのように渡すことができる
もし変数msg
が存在したらメールを送付する
task :send_emails_from_admin, ['msg'] => :environment do |task, args|
msg = args['msg']
if msg.present?
NotificationFromAdminJob.perform_later(msg)
end
end
↓「こんにちは」というメールが送付されている
task :send_emails_from_admin, ['msg'] => :environment do |task, args|
msg = args['msg']
if msg.present?
NotificationFromAdminJob.perform_later(msg)
else
puts '送信できませんでした。メッセージを入力してください。ex. rails notification:send_emails_from_admin\[こんにちは\]'
end
end
送信できませんでした、のあとに例文を書いておくと◎
このrake taskを使いたい人がエラーになった際、すぐ解決することができる
#DAY11