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

ここで2つの別々の検証を行っているようです:

  • ユーザーが電子メール アドレスを提供する場合は、その形式と一意性を検証します
  • ツイッターのサインアップでない限り、メールアドレスの存在を検証する

これを 2 つの個別の検証として行います。

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 に答える