2016-09-26 4 views
0

私は時間データ型の "duration"フィールド(Rails 4.2.6/Ruby 2.2.4アプリケーション)を持つカーディオモデルを持っています。カスタムバリデータのトラブルシューティングを手伝って、ユーザーが10分未満のエアロビックトレーニングを保存できないようにする必要があります。時間を10分未満で拒否するカスタムバリデータを作成する方法

ここに私_form.html.erb内の関連するフィールドがあります:

<%= f.input :duration do %> <br> 
<%= f.time_select :duration, :include_blank => true, include_seconds: true %> 
<% end %> 

はここで

class DurationExceedsTenMinValidator < ActiveModel::EachValidator 

    def validate_each(record, attribute, value) 
      unless duration_exceeds_ten_min 
      record.errors[attribute] << "must be at least 10 min" 
     end 
    end 

    private 

# Check if duration is greater than or equal to 10 minutes, a.k.a. duration_exceeds_ten_min 
# If that's the case, return true, otherwise false. 

    def duration_exceeds_ten_min 
    if Time.parse(self.duration.strftime("%H:%M:%S") < "00:10:00") 
     return false 
    else 
     return true 
    end 
    end 
end 

/app/validators/duration_exceeds_ten_min_validator.rbの私のカスタムバリデータのマイcardio_exercise model(cardio_exercise.rb)、私はこれを加えました:

undefined method `duration' for #<DurationExceedsTenMinValidator:0x0000000ef5c4c8> 

I「力」真または偽の条件は、カスタムバリデータが正常に動作しているように見えます:コードが実行されると

validates :duration, duration_exceeds_ten_min: true 

、それは次のようなエラーがスローされます。 if文には何か問題があります。私は立ち往生している。私は条件を正しく設定する方法を理解できません。カスタムバリデータを修正するにはどうすればよいですか?私は助けて&アドバイスを感謝します!

答えて

0

カスタムバリデータの問題は、time_select HTMLに「ignore_date」オプションを含めることができなかったことが原因です。

私のソースコードを見ているうちに、ユーザーの入力された時間値に日付値が含まれていることに気付きました。これらの「隠しフィールド」のためにカスタムバリデータが失敗しました。 Ruby on Railsのドキュメントでは、「このメソッド[time_select]は、ignore_dateオプションがtrueに設定されていない限り、実際の年、月、日に3つの入力隠しタグを生成します。

私のHTMLで ":ignore_date to true"オプションを設定した後、私のカスタムバリデータは正常に動作します。そのHTMLの変化は問題を解決しました。ユーザーは、もはや10分間未満の運動を保存することはできません。私はこれが将来他の人に役に立つ情報であることを願っています。

私はカスタムバリデータを改善するのに役立ち、バリデーターに "self"の配置が機能しない理由を説明するために、@maxに貢献します。

1

ちょうど時間を秒にキャストして、ActiveSupport :: Durationを頑張らせてください。あなたがあなたのバリデータでself.durationを使用しているので、あなたの方法は、それを動作しない理由に興味がある場合は

def validate_each(record, attribute, value) 
    if value.to_i.seconds < 10.minutes 
    record.errors[attribute] << "must be at least 10 min" 
    end 
end 

。ここではselfがバリデータです。モデルではありません。

+0

提案された解決策を試しましたが、動作させることができません:バリデータは、継続時間が< or > 10分であるかどうかの保存を防止します。私のコードの文脈であなたの答えを更新できますか?あなたの提案された解決策について何か不足している可能性があります。 – codeinspired

+0

期間がゼロではないと確信していますか?たとえば、パラメータをホワイトリストに登録していない場合などです。 – max

+0

'nil.to_i.seconds == 0.seconds' – max

関連する問題