2

私はユーザモデルを持つ基本的なアプリケーションを持っています。ユーザーがアカウントを作成すると、そのユーザーにメールを送信します。私はもともとコントローラー自体にこの設定をしていました。Ruby Guidesが私に尋ねるように私は実際にオブザーバを使用すべきですか

if @user.save 
    UserMailer.welcome_email(@user, new_session_url).deliver 
    redirect_to root_url, notice: 'User was successfully created. Please check your email for more information' 

これは私にとっては当時のようでした。私は後でObservers in Railsについて学びました。オブザーバーを使用する一般的な例は、この電子メールロジックをコントローラーの外で "ユーザーオブザーバー"の上に移動することでした。これは素晴らしい考えのようでした。

私はすぐに2つの主要な問題に遭遇した:

  1. 私の観察者がnew_session_urlにアクセスすることはできません。私は本当に私の電子メールにユーザーにログインページに戻るリンクを含めることができるようにしたい。私は、この問題に触れることなく、これにオブザーバーを使用する例がたくさんあることにショックを受けています。
  2. 私のオブザーバーはフラッシュメッセージにアクセスできません。電子メールが送信されたことをユーザーに通知することはできません。

私の質問はこれです。私はここでオブザーバーを使うべきですか?私のように見え始めたのは、コントローラで直接コールバックを使用するほうがずっと簡単でした。これがオブザーバにとって適切なユースケースではない場合は何ですか?この状況は、オブザーバーを使用する主な例の1つと考えられます。

答えて

4

あなたはオブザーバーでsession-url(均一なフラッシュ)にアクセスする必要はありません。

あなたはちょうどこのようなメソッドを呼び出す必要があります:

コントローラーを

if @user.save 
    redirect_to root_url, notice: 'User was successfully created. Please check your email for more information' 
end 

オブザーバー:

def after_create(user) 
    UserMailer.welcome_email(user).deliver 
end 

あなたは、実際のビューでセッションURLを使用する必要があります。

welcome_email.html.erb

<%= new_session_url %> 

このようにして、電子メールロジックを個別にテストすることができます。また、ユーザーを作成するための複数のエントリポイントがある場合は、ロジックをどこにでも複製する必要はありません。

+0

ありがとうございます。私は、html.erbファイルの電子メールがルートヘルパーにアクセスできることを知らなかった。それはそれを通過させるよりも簡単ですし、より理にかなっています。 – corsen

関連する問題