Rails 4用户模型不会使用来自oauth的哈希数据进行保存

时间:2015-08-20 06:29:01

标签: ruby-on-rails ruby ruby-on-rails-4 oauth

我正在尝试将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)并保持正确的值,验证失败的原因。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

您的问题是find_or_create_by方法。

这将寻找uidprovider的用户,否则尝试创建它。

但没有vaild用户名,依此类推,如果没有uidprovider

的用户,它将始终失败

<强>更新

  

您尝试查找的用户uidprovider。如果   find_or_create_by找到有效用户,它会返回它。有了这个   你可以更新数据。

     

但是如果find_or_create_by找不到有效用户,则会创建一个具有给定参数uidprovider的用户。但是   创建有效用户,您的模型需要有效的用户名,有效   password和有效email

你可以做这样的事情

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