会话在行动梅勒 - 如何传递它?

时间:2017-05-01 07:27:16

标签: ruby-on-rails session actionmailer

假设我有一个人们可以获得免费电子书的网站,如果他们要注册时事通讯 - 完成后我会创建一个用户模型,我会向他们展示编辑表格以添加一些额外的细节关于他们。

我不想强迫他们在第一页上添加密码或任何其他详细信息,因为它会减少转换次数,我也不需要其他信息。此外,我不希望他们永远访问编辑页面,所以我通过为他们分配了一个会话并在编辑页面上通过它来识别它来解决它。这是我的控制者:

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向他们发送一封电子邮件,其中包含指向编辑表单的链接,并要求他们这样做。

问题是如何通过会话识别用户并向他们显示表单 - 我如何通过ActionMailer执行User.find(session [:user_id])?它实际上是一种正确的方法,还是会推荐一种不同的方法?

1 个答案:

答案 0 :(得分:0)

一种方法是将后台作业设置为在10分钟内运行。

在这份工作中,你会检查他们是否仍未注册&#34;。如果他们尚未完成注册,您就会发送电子邮件。

像这样;

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