Rails4、devise、omniauth、facebook:常规注册涉及嵌套表单时出现的问题

Rails 4, devise, omniauth, facebook: problems when regular sign up involves nested forms

我正在尝试设置与 omniauth 和设计的 facebook 登录集成。

请注意,我有一个包含设备信息的 MEMBER 模型和一个包含成员个人资料信息的 USER 模型(以将它们分开)

在注册页面上,用户在会员注册表单中有一个嵌套表单,并接收当时所有的用户数据。保存成员后,已保存成员的电子邮件值也会像这样 table 输入到用户

class Member < ActiveRecord::Base
   # Include default devise modules. Others available are:
   # :confirmable, :lockable, :timeoutable and :omniauthable
   devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable 

after_save :update_user

 def update_user
   user.email = self.email
   user.save
 end

我有facebook数据处理的标准模型方法.....

def self.process_omniauth(auth)
where(provider: auth.provider, uid: auth.uid, email:  auth.info.email).first_or_create do |member|
  member.provider = auth.provider
  member.uid = auth.uid
  member.email = auth.info.email
 end
end

但是当然,在这种情况下,没有嵌套形式,因此 'user' 没有实例化,并且在保存成员时调用 update_user 方法时会抛出错误。

在通过 facebook 途径注册时,如何修改上述方法以实例化新用户?

编辑:这行得通......

def update_user
    if User.find_by_member_id(self.id).present?
      user.email = self.email
      user.save
    else
     User.create(:email => self.email, :member_id => self.id)
    end
 end

但这会导致约束错误 - 在电子邮件上 - 它已经存在于数据库中。从日志来看,这里的 else 语句似乎试图创建用户两次。

 def update_user
    if User.find_by_member_id(self.id).present?
      user.email = self.email
      user.save
    else
        User.create(:email => self.email)
    end
 end

谁能解释一下?我很惊讶我不得不在 else 块中将外键传递给用户。

我不确定用户模型中存储了哪些字段,但您应该在此处执行什么操作,在 Facebook 回调的情况下,如果会员没有与之关联的用户,您应该创建用户。即你的 update_user 应该是这样的:

def update_user
  if user.present?
    user.email = self.email
    user.save
  else
    User.create(:email => self.email, :member_id => self.id)
    /*note that a lot of other information is returned in
      facebook   callback like First Name, Last Name, Image and
      lot more, which i guess you should also start saving to 
      User  Model */
  end

结束

**** 编辑 ******** 。您还应该检查是否有用户使用相同的电子邮件并将其与该成员相关联。

def update_user
  if user.present?
    user.email = self.email
    user.save
  else
    user = User.find_by_email(self.email)
    if user
      user.update_attribute(:member_id, self.id)
    else
      User.create(:email => self.email, :member_id => self.id)
    end
  end