0

我正在尝试为 Twitter/FB 设置 Omniauth 登录。我创建了自己的身份验证系统,在创建用户时验证密码和电子邮件。但是,当我的用户通过 Twitter/Fb 登录时,我不想验证密码或电子邮件。

我创建了一个名为omniauth_login 的用户属性。我将它用作布尔值来测试我的 should_validate_password 中是否需要验证?方法。

用户.rb

attr_accessor :password, :updating_password, :omniauth_login
validates_presence_of :password, :if => :should_validate_password?
validates_confirmation_of :password, :if => :should_validate_password?

def should_validate_password?
  (updating_password || new_record?) && !(self.omniauth_login == 'true')
end

def self.create_with_omniauth(auth)
  create! do |user|
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["info"]["name"]
  end
end

这是我用于创建用户的控制器:

session_controller.rb

def omniauth_create
  auth = request.env["omniauth.auth"]
  user = User.new
  user.omniauth_login = 'true'
  user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||         
         User.create_with_omniauth(auth)
  session[:user_id] = user.id
  redirect_to user
end

当我尝试通过 twitter 登录来创建新用户时,我仍然收到验证错误:

Validation failed: Password can't be blank, Email can't be blank, Email is not valid.

如果我的对象是在 create_with_omniauth 方法中创建的,如何跳过密码和电子邮件的验证?

谢谢。

4

1 回答 1

0

我认为这里的问题是您有两个单独的用户实例,一个将omniauth_login 设置为“true”,另一个没有。第一个是从

user = User.new
user.omniauth_login = 'true'

第二个是

User.create_with_omniauth(auth)

. 此处创建的第二个实例没有将 omniauth_login 设置为“true”,因此它仍然运行验证。试试这个

user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||         
 User.create_with_omniauth(auth)

并在 create_with_omniauth 中,添加user.omniauth_login = 'true' .

于 2012-06-09T20:28:03.060 回答