7

我在注册表单上有这个验证规则:

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

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

4

5 回答 5

8

您可以在将用户保存在代码中时跳过验证。而不是使用user.save!,使用user.save(:validate => false)从Omniauth 的 Railscasts 剧集中学到了这个技巧

于 2012-09-30T13:42:50.773 回答
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对 :uniqueness 验证器使用相同的方法。否则它会。不过,我也不确定:(。对不起

于 2012-09-30T13:13:07.517 回答
2

跳过单个验证 跳过单个验证需要更多的工作。我们需要在我们的模型上创建一个类似于 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
于 2018-01-12T05:19:32.683 回答
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?}

附加信息: 仅当不是空白 Rails 3 时才验证电子邮件格式

于 2012-09-30T16:19:38.270 回答
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?}
于 2018-01-12T06:21:48.400 回答