エラー
Rakeタスクを実行したときに、NameError: uninitialized constant ClassName
が出る。
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 c
でSendMailer.to_admin.deliver_now
を実行する。
→うまくいく。ということは、SendMailer
自体には問題はなさそう。
require Rails.root.join("app/mailers/send_mailer")
を追加する。
→NameError: uninitialized constant ApplicationMailer
根本的にダメそう。
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 について