Rails 3中 - 如何跳过验证规则?(Rails 3 - how to skip validat

2019-09-23 06:19发布

我有一个登记表,这个验证规则:

  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登录的机会。 微博不提供用户的电子邮件地址。

如何在这种情况下,上面的验证规则跳过?

Answer 1:

同时节省您的代码,用户可以跳过验证。 而不是使用user.save! 使用user.save(:validate => false) 。 据悉,从这一招对Omniauth Railscasts插曲



Answer 2:

我不知道我的回答是否正确,只是想帮助。

我认为你可以采取的帮助这个问题 。 如果我修改接受的答案你的问题,它会像( 免责声明 :我无法测试以下代码为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为:唯一性验证过。 否则会。 虽然,我不知道太:(对不起



Answer 3:

你似乎在这里做两个独立的验证:

  • 如果用户提供的电子邮件地址,验证它的格式和独特性
  • 验证电子邮件地址的存在,除非它是一个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



Answer 4:

最好的办法是:

当用户没有从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?}


Answer 5:

个人跳绳跳绳验证个人验证需要多一点的工作。 我们需要建立在我们的模型称为像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


文章来源: Rails 3 - how to skip validation rule?