4

ユーザーがステータスを送信できるように、reports_controller.rb にこのメソッドがあります。

def send_status        
  date = Date.today        
  reports = current_user.reports.for_date(date)        
  ReportMailer.status_email(current_user, reports, date).deliver        
  head :ok      
  rescue => e        
  head :bad_request    
end

ユーザーがこのレポートを送信したかどうかを確認するために、ActiveAdmin からこのアクションを呼び出すにはどうすればよいですか? 列などの status_tag のようにしたい。メンバーアクションを行う必要がありますか?

ありがとう!

4

1 に答える 1

2

レポートが送信されたかどうかを確認する問題については後で説明しますが、最初に、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 & ステータスを追跡するユーザーの列を更新するオブザーバーを実装します。しかし、あなたは本当にそれをしたくありません。上で述べたように、リファクタリングを検討してください。

于 2012-09-19T15:37:19.280 に答える