Rails4、design、omnauth、facebook:当常规注册涉及嵌套表单时会出现问题



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

注意,我有一个包含设备信息的MEMBER模型和一个包含成员配置文件信息的USER模型(以使它们分开)

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

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

我有脸书数据处理的标准模型方法。。。。。

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

有人能解释一下吗?我很惊讶我不得不把外键传给其他区块的用户。

我不确定用户模型中存储了哪些字段,但你应该在这里做什么,在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

最新更新