【rails】Rakeタスクを使う

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

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とは

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