Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 设计:将现有来宾用户转换为注册用户_Ruby On Rails_Devise_Registration - Fatal编程技术网

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