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
我正在尝试设置与 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