2012-09-30 88 views
4

我有一個登記表,這個驗證規則:Rails 3 - 如何跳過驗證規則?

validates :email, 
    :presence => {:message => 'cannot be blank.'}, 
    :allow_blank => true, 
    :format => { 
     :with => /\A[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]+\z/, 
     :message => 'address is not valid. Please, fix it.' 
    }, 
    :uniqueness => true 

此規則檢查,如果用戶填入登記表的電子郵件地址(+其正確的格式)。

現在我試圖添加使用Twitter登錄的機會。 Twitter不提供用戶的電子郵件地址。

如何在這種情況下跳過上面的驗證規則?

+0

當我通過twitter進行身份驗證時,我將用戶重定向到註冊頁面,並要求他填寫錯過的字段。 稍後,您可能需要發送電子郵件。例如發送郵件給用戶。 – ck3g

回答

2

我不確定我的回答是否正確,只是想幫忙。

我認爲你可以從this question獲得幫助。如果我修改接受的答案你的問題,它會像(免責聲明:我無法測試以下代碼爲ENV是不是在電腦我現在的工作做好準備)現在

validates :email, 
    :presence => {:message => 'cannot be blank.', :if => :email_required? }, 
    :allow_blank => true, 
    :format => { 
    :with => /\A[A-Za-z0-9._%+-][email protected][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作爲唯一性驗證程序。否則會。雖然,我不知道太:(對不起

5

您可以跳過驗證,同時節省您的代碼的用戶,而是利用user.save!的,使用user.save(:validate => false)。據悉這一招從Railscasts episode on Omniauth

+4

爲什麼跳過所有驗證?任何其他驗證可能應該運行。 –

+0

謝謝@JasonNoble。沒有想到:-) –

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

+0

'is_twitter_signup'是某種方法或只是在保存/登錄時傳遞額外的變量?謝謝! – Gediminas

+0

是的,對於twitter用戶,'is_twitter_signup'將返回true,否則返回false。 –

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 
0

最好的辦法是:

這將驗證電子郵件,當用戶未在Twitter的簽署,以及來自Twitter簽署時可跳過電子郵件驗證。

validates :email, 
    :presence => {:message => 'cannot be blank.'}, 
    :allow_blank => true, 
    :format => { 
     :with => /\A[A-Za-z0-9._%+-][email protected][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?}