2017-09-26 10 views
0

私はRailsを学習しています。私はこのカスタム検証を続けました。私は(:cpf)と呼ばれるフォームフィールドを渡すために、さまざまなアプローチを試して、成功なしに検証しました。私もActiveModel :: EachValidatorを使ってみましたが、もっと混乱します。妥当性検査は、11を法とするチェックデジットです。これが私の結論です。Rails 5カスタムバリデーション

コントローラ/ drivers_controller.rb

def new 
    @driver = Driver.new 
    end 

    def create 
    @driver = Driver.new(driver_params) 
    if @driver.save 
     flash[:success] = "Motorista cadastrado com sucesso!" 
     redirect_to @driver 
    else 
     render 'new' 
    end 
    end 

モデル/ driver.rb

class Driver < ApplicationRecord 

validate :checkcpf 

private 

    def checkcpf 
    return false if cpf.nil? 
    nulos = %w{12345678909 11111111111 22222222222 33333333333 44444444444 55555555555 66666666666 77777777777 88888888888 99999999999 00000000000} 
    valor = cpf.scan /[0-9]/ 
    if valor.length == 11 
     unless nulos.member?(valor.join) 
     valor = valor.collect{|x| x.to_i} 
     soma = 10*valor[0]+9*valor[1]+8*valor[2]+7*valor[3]+6*valor[4]+5*valor[5]+4*valor[6]+3*valor[7]+2*valor[8] 
     soma = soma - (11 * (soma/11)) 
     resultado1 = (soma == 0 or soma == 1) ? 0 : 11 - soma 
     if resultado1 == valor[9] 
      soma = valor[0]*11+valor[1]*10+valor[2]*9+valor[3]*8+valor[4]*7+valor[5]*6+valor[6]*5+valor[7]*4+valor[8]*3+valor[9]*2 
      soma = soma - (11 * (soma/11)) 
      resultado2 = (soma == 0 or soma == 1) ? 0 : 11 - soma 
      return true if resultado2 == valor[10] # CPF VALIDO 
     end 
     end 
    end 
    return false # CPF INVALIDO 
    errors.add(:cpf, "CPF INVÁLIDO") 
    end 
end 

私は私が検証するために私のCPFフィールドを渡す方法行方不明だと思います。エラーメッセージが表示されたり、検証が失われたりします。

後でRailsから理解を深めると、ActiveModel :: EachValidatorを使用しようとします。これは私が通常やっていることですが、Railsの方法でリファクタリングして理解できる方法で作業するようにしてください。

ご協力いただきありがとうございます。ありがとうございました!すべての

答えて

1

まず、このメソッドからtrueまたはfalseのいずれかを返す必要はありません、ただreturn - あなたはフィールドが有効であるため、メソッドから返されたり、エラーを追加するかします。私はあなたの検証のロジックにはほとんど従いませんでしたが、結果にかかわらず常にreturn false # CPF INVALIDOとなり、errors.add(:cpf, "CPF INVÁLIDO")という行には決して到達しません。あなたがメソッドからreturnたびに実行を停止するので、少なくとも1つの実行パスがあることを確認する必要があります。実際にエラーが追加される行に到達する可能性があります。

+0

ご協力いただきありがとうございます。たぶん私はこのメソッドをテストし、その真偽を検証しようとするモジュールを作成します... –