我正在尝试为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方法中创建对象,如何跳过密码和电子邮件验证?
感谢。
答案 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'