2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】Rakeタスクに:environmentがないとRailsの環境で実行できない

Last updated at Posted at 2020-03-05

エラー

Rakeタスクを実行したときに、NameError: uninitialized constant ClassNameが出る。

send_mail.rake
namespace :send_mail do
  desc 'メール送信する'
  task :to_admin do
    SendMailer.to_admin.deliver_now
    puts 'メールを送信しました'
  end
end
$ rake send_mail:to_admin
rake aborted!
NameError: uninitialized constant SendMailer
/Users/k_end/workspace/application/lib/tasks/send_mail.rake:4:in `block (2 levels) in <top (required)>'
Tasks: TOP => send_mail:to_admin
(See full trace by running task with --trace)

どうやらSendMailerが読み込みできていないようです。
しかし、パスは正しいしタイポもしていない……。

試行錯誤

rails cSendMailer.to_admin.deliver_nowを実行する。
→うまくいく。ということは、SendMailer自体には問題はなさそう。

send_mail.rake
require Rails.root.join("app/mailers/send_mailer")

を追加する。
NameError: uninitialized constant ApplicationMailer
根本的にダメそう。

send_mail.rake
namespace :send_mail do
  desc 'メール送信する'
  task :to_admin do
    # SendMailer.to_admin.deliver_now
    puts 'メールを送信しました'
  end
end

原因であろう部分をコメントアウトしてみる。
→うまくいく。

この辺から、「多分RakeタスクがRails環境で実行されていないんだろうなー」と予測。

原因

taskに:environmentを付けていませんでした。generateした時点で自動的に付いているはずなのですが、どこかで消えていた模様。

namespace :send_mail do
  desc 'メール送信する'
  task to_admin: :environment do
    SendMailer.to_admin.deliver_now
    puts 'メールを送信しました'
  end
end
$ rake send_mail:to_admin
メールを送信しました

無事、SendMailerを呼び出してタスクを実行することができました。
Railsのクラスを使うときはRails環境を明示して呼び出す必要があります。
気が付いてみれば大したことがないのに、ハマるときは無駄にハマる。

リンク

:environmentで何やってるの?という点についてまとめている先人がいました。
Rails における rake タスクの :environment について

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?