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

use*_*621 6 ruby twitter validation model ruby-on-rails

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

  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
Run Code Online (Sandbox Code Playgroud)

如果用户填写注册表单电子邮件地址(+正确格式),则执行此规则检查.

现在我正在尝试添加使用Twitter登录的机会.Twitter不提供用户的电子邮件地址.

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

Pra*_*thy 7

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

  • 为什么要跳过所有验证?应该运行任何其他验证. (4认同)

Hun*_*der 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
Run Code Online (Sandbox Code Playgroud)

现在,您更新email_required?方法来确定它是否来自 Twitter!如果来自 Twitter,则返回 false,否则返回 true。

我相信,您:if也需要对 :uniqueness 验证器使用相同的内容。否则它会的。不过,我也不确定:(。抱歉