レポートが送信されたかどうかを確認する問題については後で説明しますが、最初に、ActiveAdmin からコントローラー アクションを呼び出す方法について説明します。
ReportsController#send_status
を作成してから目的のメソッドを呼び出すことで呼び出すことができますがActionController::Base::ReportsController
、たとえば
ActionController::Base::ReportsController.new.send_status
これは良い考えではありません。いくつかの潜在的な問題に対処するために、おそらくこれをリファクタリングする必要があります。
app/controllers/reports_controller.rb
:
class ReportsController < ApplicationController
... # rest of controller methods
def send_status
if current_user # or whatever your conditional is
ReportMailer.status_email(current_user).deliver
response = :ok
else
response = :bad_request
end
head response
end
end
app/models/user.rb
:
class User < ActiveRecord::Base
... # rest of user model
def reports_for_date(date)
reports.for_date(date)
end
end
app/mailers/reports_mailer.rb
class ReportsMailer < ActionMailer::Base
... # rest of mailer
def status_email(user)
@user = user
@date = Date.today
@reports = @user.reports_for_date(@date)
... # rest of method
end
end
これは明らかにさらにリファクタリングできますが、適切な出発点を提供します。
考慮すべき重要な点は、このコントローラー アクションは電子メールを非同期的に送信しないということです。そのため、同時実行性とユーザー エクスペリエンスのために、キュー システムの使用を強く検討する必要があります。DelayedJob は、私が提供した例を使用して簡単に実装できます (DelayedJob RailsCast を調べてください)。
レポートが送信されたかどうかを確認する限り、ActionMailer Observer を実装してそのオブザーバーを登録できます。
これには、User
モデルに BOOLEAN 列がstatus_sent
あり、ユーザーが一意の電子メール アドレスを持っている必要があります。
lib/status_sent_mail_observer.rb
:
class StatusSentMailObserver
self.delivered_email(message)
user = User.find_by_email(message.to)
user.update_attribute(:status_sent, true)
end
end
config/intializer/setup_mail.rb
:
... # rest of initializer
Mail.register_observer(StatusSentMailObserver)
DelayedJob (または他のほぼすべてのキュー システム) を使用している場合は、ユーザーの列を更新するジョブの完了時 (つまり、ステータス メールの送信時) に呼び出されるコールバック メソッドを実装できます。
毎日のステータス メッセージを追跡する場合は、Status
に属するモデルの作成を検討する必要がありUser
ます。ステータス モデルは、ユーザーが電子メールを送信するたびに作成されるため、ステータス レコードが存在するかどうかを確認するだけで、電子メールが送信されたかどうかを確認できます。この戦略は、単純なstatus_sent
列よりも採用を真剣に検討したい戦略の 1 つです。
tl;dr ActionController::Base::ReportsController.new.send_status
& ステータスを追跡するユーザーの列を更新するオブザーバーを実装します。しかし、あなたは本当にそれをしたくありません。上で述べたように、リファクタリングを検討してください。