2017-05-01 5 views
0

私は、ニュースレターにサインアップする人々が無料の電子ブックを手に入れることができるウェブサイトを持っているとしましょう。彼らがそれを済ませたら、私はUserモデルを作成し、Edit Formを表示して、それら。Session in Action Mailer - それを渡す方法は?

最初のページにパスワードやその他の詳細を追加する必要はありません。コンバージョンが減少するため、追加情報も必要ないためです。また、編集ページに永久にアクセスすることを望んでいないので、セッションを割り当てて編集ページでそれを認識することで解決しました。

class UsersController < ApplicationController 

    def create 
    user = User.new(user_params) 
    if user.save 
     session[:user_id] = user.id 
     UserWorker.perform_in(5.minutes, 'new_user', user.id) 
     redirect to edit form... 
    end 
    end 

    def edit 
    @user = User.find(session[:user_id]) 
    end 

    def update 
    @user = User.find(session[:user_id]) 
    @user.update!(user_edit_params) 
    redirect_to user_thank_you_path 
    end 
end 

しかし、彼らは10分以内に余分な情報を追加しない場合、私は編集フォームへのリンクをActiveMailerを経由してそれらに電子メールを送信し、そうするように依頼します:これは私のコントローラです。

セッションを通してユーザーを識別し、フォームを表示するにはどうすればよいですか - どのようにUser.find(ActionMailer経由でセッション[:user_id])を実行できますか?それは実際に正しい方法ですか、別の方法をお勧めしますか?

答えて

0

10分で実行するバックグラウンドジョブを設定することもできます。

そのジョブの中で、まだ「登録が解除されている」かどうかを確認します。登録を完了していない場合は、電子メールを送信します。

このようなものです。

class UsersController < ApplicationController 
    def create 
    user = User.new(user_params) 
    if user.save 
     session[:user_id] = user.id 
     RegistrationCompletionReminderWorker.perform_in(10.minutes, user.id) 

     # redirect to edit form... 
    end 
    end 
end 


class RegistrationCompletionReminderWorker 
    def perform(user_id) 
    user = User.find(user_id) 

    if user.password.nil? # or whatever your logic for registration completion is 
     UserMailer.registration_reminder(user_id).deliver_now 
    end 
    end 
end 
+0

ありがとうハッサニン。私はちょうど私の質問が非常にはっきりしていないので、私はそれを編集したことに気づいた私は5分後にメールを解決するためにこの問題を解決しましたが、編集フォームへのリンクを送信してユーザーを特定する方法がわかりません - ActionMailer経由でセッションを渡すことはできません。 – Dudis

+0

@Dudis心配はありません。メーラーに 'user_id'を渡すことができます。メーラーの中で 'edit_user_url(user_id)'を使うこともできます。 –

関連する問題