3

ここで基本的な質問をお許しください。

読んでみると、コントローラーの作成アクションを別のコントローラーからトリガーすることはベストプラクティスではないことがわかります。次の状況でコードを整理する方法についてアドバイスを探しています。

ケースと通知の 2 つのコントローラーがあります。

新しいケースが作成されたら、新しい通知も作成したいと思います。

通知作成アクションは、モデル内に新しいインスタンスを作成し、電子メールを送信します。

ケースコントローラーから Notification#create を呼び出すだけではいけないと考えるのは正しいですか? これをヘルパーまたはモジュールに抽出する必要がありますか? もしそうなら、それはどのように見えますか?このトピックに関する他のほぼ同様の投稿では詳しく説明されていません。

ありがとうございました。

4

4 に答える 4

3

createはPOSTメソッドであるため、casesコントローラーからcreateofnotificationsコントローラーを呼び出す方法はないと思います。私の提案は、通知インスタンスの作成とメール送信ロジックを、ケースモデルを保存する前に移動することです。これにより、ケースが作成されるたびに通知が作成され、メール送信メカニズムも処理されます。これはビジネス要件の一部であるため、ビジネスロジックをモデルに移動することをお勧めします。

于 2012-09-13T02:28:04.130 に答える
1

このロジックはモデルに含まれている必要があります。良い解決策は、ActiveRecordコールバックを使用することです。

# app/models/case.rb
class Case < ActiveRecord:Base
  after_create :create_notification

private        # <--- bottom of your model
  def create_notification
    Notification.create!(some_options_for_notification)
  end
end

# app/models/notification.rb
class Notification < ActiveRecord:Base
  after_create :send_notification

def send(opts)
  ...          # <--- some logic to send notification here
end


private        # <--- bottom of your model
  def send_notification
    send(some_options_for_sending)
  end
end
于 2012-09-13T02:42:14.617 に答える
1

オプションの 1 つとして、Rails オブザーバーを使用して通知を作成できますhttp://api.rubyonrails.org/classes/ActiveRecord/Observer.html

オブザーバーとコールバックの間にはほとんど違いがありません。たとえば、オブザーバーはモデルアクションをキャンセルできませんが、あなたの場合、何を使用しても問題ないと思います。

しかし、オブザーバーは、単一責任の原則にも従っていました。

class CaseObserver < ActiveRecord::Observer
 def after_create(case)
    #create notification
 end
end

に保存する必要があります/app/models/case_observer.rb.

あなたのconfig/application.rb

config.active_record.observers = :case_observer
于 2012-09-13T12:08:12.113 に答える
0

ケースコントローラーアクションにNotification.createを記述するだけで、それだけです。

必要なだけコードを記述し、コントローラーアクションで必要なだけモデルを作成できます。

于 2012-09-12T20:40:03.550 に答える