2009-06-16 6 views
3

model_name.rbファイルにバリデーションがあるモデルがある場合、どのようにこれらのバリデーションに手動でアクセスできますか?私は内蔵のRailsのトリックと一緒に動作する私自身のフォーム検証システムを調理したいと思います。私はすべてをDRYとして可能な限り維持したいと思います。私の主な問題は、フォーム値のいずれかがデータベースにヒットする前にサーバー側の検証を行う必要があることです(私は多段階フォームを使用しています)。Railsモデルのバリデーションを取得

基本的に私は

User.validations.each do |v| 
    puts v.constraint.to_s + " " + v.message 
end 

のような方法がある場合、これと同様のものがあります思ったんだけど?

ありがとうございます。

答えて

1

私の主な問題は、私は(私は多段階フォームを使用して よ)フォームの値がデータベースにヒット のいずれかの前に、 サーバー側の検証を行う必要があるということです。

モデルがそのクラスファイル内の検証に応じて有効でない場合(あなたが検証を抑制するためにsave方法にfalseを渡さない限り)、そのデータがデータベースに保存されません。

  • それはそのvalid?/invalid?メソッドを呼び出すことによって、任意の時点で有効だ場合は、モデルを求めることができます。
+0

私のフォームには、約4つのステップがあります。どのモデルも第3ステップまでは.saveメソッドを呼び出しません。しかし、私はいくつかの基本的なバリデーションを行う必要があります(ボックスを選択しないと、エラーを出力する必要があります) saveを呼び出さずに引き続き検証が実行されますか? – user94154

+0

上記の有効/無効の編集を参照してください。メソッド。 –

0

ActiveRecordオブジェクトは有効な後にエラーメソッドを公開しますか?が呼び出され、どのバリデーションが違反されたかに関するメッセージが表示されます。あなたは有効であることを確認できますか?フォームの一部のフィールドが無効であるかどうかを確認してください。 field1とfield2のフィールドを持つフォームの場合、このようなことを行うことができます。

unless x.valid? 
    [:field1,:field2].each do |field| 
    yes_there_was_an_error if x.errors[field] 
    end 
end 
0

最善の方法は、状態マシンを使用して、フォームのさまざまなステップ間でデータをデータベースに保存することです。

validates_presence_of :username, :if => proc {|u| u.signup_step >= 2 }signup_stepは、データベースの整数列です。

あなたはフォーム間でデータベースに保存したくないと言っても、私はそうすべきだと思います。これを行うと、厄介なハッキングなく、定期的な検証とモデルを使用することができます。そして、正直なところ、このようにするのは問題だとは思っていません。

+0

非常に気の利いた!私はこれを打つつもりだと思う...と私はすでにセッションでデータベースに格納する...私はより明確にすべきだったと思う - 私はActiveRecordオブジェクトとしてデータベースに格納しないでください特定のステップ。 ありがとう! – user94154

関連する問題