如果从某个方法创建对象,则跳过验证

时间:2012-06-09 20:15:02

标签: ruby-on-rails ruby-on-rails-3 validation omniauth

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

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

User.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

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

sessions_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方法中创建对象,如何跳过密码和电子邮件验证?

感谢。

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是你有两个独立的User实例,一个将omniauth_login设置为'true',另一个没有设置为'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'