我正在尝试将oauth添加到我的项目的现有登录中,但是当我检索哈希数据并尝试使用user.save!
保存用户参数时,验证规则将失败。
user.rb
has_secure_password
validates :email, :format => { :with => /\A[^@ ]+@[^@ ]+\.[^@ ]+\Z/ },
:uniqueness => { :case_sensitive => false }
validates :password, :presence => true, :on => :create
validates :username,
:format => { :with => /\A[A-Za-z0-9][A-Za-z0-9_-]{0,24}\Z/ },
:uniqueness => { :case_sensitive => false }
...
class << self
def from_omniauth(auth_hash)
user = find_or_create_by(uid: auth_hash['uid'], provider: auth_hash['provider'])
user.name = auth_hash['info']['name']
user.email = auth_hash['info']['email']
user.username = auth_hash['info']['email']
user.save!
user
end
end
user.errors.full_messages
的输出给了我["Password can't be blank", "Password can't be blank", "Email is invalid", "Username is invalid"]
。
我不明白的是,如果已定义数据参数(即user.email
)并保持正确的值,验证失败的原因。
我错过了什么?
答案 0 :(得分:0)
您的问题是find_or_create_by
方法。
这将寻找uid
和provider
的用户,否则尝试创建它。
但没有vaild用户名,依此类推,如果没有uid
和provider
<强>更新强>
您尝试查找的用户
uid
和provider
。如果find_or_create_by
找到有效用户,它会返回它。有了这个 你可以更新数据。但是如果
find_or_create_by
找不到有效用户,则会创建一个具有给定参数uid
和provider
的用户。但是 创建有效用户,您的模型需要有效的用户名,有效password
和有效
你可以做这样的事情
def from_omniauth(auth_hash)
user = User.find_by(uid: auth_hash['uid'], provider:auth_hash['provider']) || User.new(uid: auth_hash['uid'], provider:auth_hash['provider'], password: 'your password methods')
user.name = auth_hash['info']['name']
user.email = auth_hash['info']['email']
user.username = auth_hash['info']['email']
user.save!
user
end