我有一个登记表,这个验证规则:
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登录的机会。 微博不提供用户的电子邮件地址。
如何在这种情况下,上面的验证规则跳过?
同时节省您的代码,用户可以跳过验证。 而不是使用user.save!
使用user.save(:validate => false)
。 据悉,从这一招对Omniauth Railscasts插曲
我不知道我的回答是否正确,只是想帮助。
我认为你可以采取的帮助这个问题 。 如果我修改接受的答案你的问题,它会像( 免责声明 :我无法测试以下代码为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。
我相信,你需要使用相同的:if
为:唯一性验证过。 否则会。 虽然,我不知道太:(对不起
你似乎在这里做两个独立的验证:
- 如果用户提供的电子邮件地址,验证它的格式和独特性
- 验证电子邮件地址的存在,除非它是一个Twitter的注册
我会做这个作为两个独立的验证:
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?}
附加信息: 验证电子邮件格式仅如果不是空的Rails 3
最好的办法是:
当用户没有从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?}
个人跳绳跳绳验证个人验证需要多一点的工作。 我们需要建立在我们的模型称为像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