Rails 3 - 如何跳过验证规则?

时间:2012-09-30 12:56:56

标签: ruby-on-rails ruby validation twitter model

我有注册表格这个验证规则:

  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不提供用户的电子邮件地址。

如何跳过上面的验证规则?

5 个答案:

答案 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)

您似乎在这里进行了两次单独的验证:

  • 如果用户提供电子邮件地址,请验证其格式和唯一性
  • 验证是否存在电子邮件地址,除非是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?}

其他信息:validate email format only if not blank Rails 3

答案 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