Ruby on rails 设计:将现有来宾用户转换为注册用户
我通过如下所述创建来宾用户,将每个新用户自动登录到站点: 这允许每个用户在我的网站上使用一些基本的东西,例如创建评论 现在,当用户决定注册时,我想将来宾用户转换为注册用户 我尝试实现我自己的Ruby on rails 设计:将现有来宾用户转换为注册用户,ruby-on-rails,devise,registration,Ruby On Rails,Devise,Registration,我通过如下所述创建来宾用户,将每个新用户自动登录到站点: 这允许每个用户在我的网站上使用一些基本的东西,例如创建评论 现在,当用户决定注册时,我想将来宾用户转换为注册用户 我尝试实现我自己的用户。新的\u与\u session方法如下: def self.new_with_session(params, session) user = User.find(session[:guest_user_id]) user.name = params[:nam
用户。新的\u与\u session
方法如下:
def self.new_with_session(params, session)
user = User.find(session[:guest_user_id])
user.name = params[:name]
user.email = params[:email]
user.password = params[:password]
user.password_confirmation = params[:password_confirmation]
user.created_at = nil
user.updated_at = nil
user.confirmed_at = nil
user.guest = false
user
rescue ActiveRecord::RecordNotFound
super
end
但这不起作用。不知何故,在提交表单时,Desive似乎检测到用户已经存在于数据库中,因此甚至不尝试对其进行验证等,而是简单地退出注册过程(因为它认为用户已经登录)并转发到其他页面,从而导致“您需要先登录或注册,然后才能继续。”flash消息
据我所知,这发生在甚至调用设计::注册控制器#创建
之前的某个地方
因此,我的问题是:有没有一种方法可以告诉Deave不要认为某个用户登录了,因为该用户已经存在于数据库中(尽管我不知道Deave在提交注册表后是如何知道该用户的)
更新
我可以进一步追踪这个问题。无论何时
self.new\u with\u session
返回一个持久化记录,注册过程都会被取消,如上所述。当返回一个新对象时,注册会继续。但我不知道在何处检查…!?目前,我坚持以下解决方案
在注册过程中,我没有尝试将来宾用户转换为注册用户,而是让Desive发挥其魔力,然后在注册完成后,使用after
钩子,立即删除新注册的用户,然后将来宾用户转换为注册用户,分配提供的属性将用户表单发送给前客人并登录
class RegistrationsController < Devise::RegistrationsController
after_filter :consolidate_registered_user_with_guest, only: :create,
if: -> { @user.valid? }
def consolidate_registered_user_with_guest
@current_user.annex_and_destroy!(@user)
sign_in @current_user
end
end
通过使用update\u列
我确保不会触发前/后挂钩,否则会发生不可预知的事情,例如,确认邮件将被重新发送(设置确认令牌时),等等
请记住,任何相关记录都不会从创建的@user
对象自动传输到现有的@current_user
,因此如果您创建任何相关对象(例如在之后的钩子中),你必须手动移动它们,这又是一件相当困难的事情。所以我认为最好避免这样的事情
如果有人有更好的解决方案,请告诉我。此外,我不确定这是否会导致一些Desive内容在后台未被整理。我正在覆盖RegistrationController创建方法,如下所示:
class RegistrationsController < Devise::RegistrationsController
def create
if user = User.find_by_email params[:user][:email]
user.update_attributes params[:user]
sign_in_and_redirect user, bypass: true
else
super
end
end
end
类注册控制器
我只是找到用户并更新他们。Deave还有一个助手,它将sign\u in
方法与重定向相结合
如果找不到用户,则继续正常操作。这听起来非常有用,谢谢!我现在没有时间亲自验证,所以我将等待检查“应答”按钮。
class RegistrationsController < Devise::RegistrationsController
def create
if user = User.find_by_email params[:user][:email]
user.update_attributes params[:user]
sign_in_and_redirect user, bypass: true
else
super
end
end
end