假设我有一个人们可以获得免费电子书的网站,如果他们要注册时事通讯 - 完成后我会创建一个用户模型,我会向他们展示编辑表格以添加一些额外的细节关于他们。
我不想强迫他们在第一页上添加密码或任何其他详细信息,因为它会减少转换次数,我也不需要其他信息。此外,我不希望他们永远访问编辑页面,所以我通过为他们分配了一个会话并在编辑页面上通过它来识别它来解决它。这是我的控制者:
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])?它实际上是一种正确的方法,还是会推荐一种不同的方法?
答案 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