我有注册表格这个验证规则:
validates :email,
:presence => {:message => 'cannot be blank.'},
:allow_blank => true,
:format => {
:with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/,
:message => 'address is not valid. Please, fix it.'
},
:uniqueness => true
此规则检查,如果用户填写注册表格电子邮件地址(+正确的格式)。
现在我正在尝试添加使用Twitter登录的机会。 Twitter不提供用户的电子邮件地址。
如何跳过上面的验证规则?
答案 0 :(得分:7)
您可以在代码中保存用户时跳过验证。不使用user.save!
,而是使用user.save(:validate => false)
。从Railscasts episode on Omniauth
答案 1 :(得分:2)
我不确定我的回答是否正确,只是想帮忙。
我认为你可以从this question获得帮助。如果我修改了你的问题的接受答案,它就像(免责声明:我无法测试以下代码,因为我现在正在使用的计算机中没有准备好env)
validates :email,
:presence => {:message => 'cannot be blank.', :if => :email_required? },
:allow_blank => true,
:format => {
:with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/,
:message => 'address is not valid. Please, fix it.'
},
:uniqueness => true
def email_required?
#logic here
end
现在,您更新email_required?
方法以确定它是否来自Twitter!如果来自twitter,则返回false,否则为true。
我相信,您需要对:uniqueness验证器使用相同的:if
。否则会。虽然,我也不确定:(。抱歉
答案 2 :(得分:1)
您似乎在这里进行了两次单独的验证:
我会将此作为两个单独的验证:
validates :email,
:presence => {:message => "..."},
:if => Proc.new {|user| user.email.blank? && !user.is_twitter_signup?}
validates :email,
:email => true, # You could use your :format argument here
:uniqueness => { :case_sensitive => false }
:unless => Proc.new {|user| user.email.blank?}
答案 3 :(得分:1)
最好的方法是:
当用户未从Twitter登录时,它将验证电子邮件,并在从Twitter签名时跳过电子邮件验证。
validates :email,
:presence => {:message => 'cannot be blank.'},
:allow_blank => true,
:format => {
:with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/,
:message => 'address is not valid. Please, fix it.'
},
:uniqueness => true
unless: Proc.new {|user| user.is_twitter_signup?}
答案 4 :(得分:0)
跳过个人验证 跳过个人验证需要更多的工作。我们需要在我们的模型上创建一个名为skip_activation_price_validation:
的属性class Product < ActiveRecord::Base
attr_accessor :skip_activation_price_validation
validates_numericality_of :activation_price, :greater_than => 0.0, unless: :skip_activation_price_validation
end
接下来,只要我们想跳过验证,我们就会将属性设置为true。例如:
def create
@product = Product.new(product_params)
@product.skip_name_validation = true
if @product.save
redirect_to products_path, notice: "#{@product.name} has been created."
else
render 'new'
end
end
def update
@product = Product.find(params[:id])
@product.attributes = product_params
@product.skip_price_validation = true
if @product.save
redirect_to products_path, notice: "The product \"#{@product.name}\" has been updated. "
else
render 'edit'
end
end