2011-02-22 11 views
23

を使用してvalidates_presence_of対の存在は、私はそうのように関連している単純なモデルのカップルを持っている:は検証:レール3

MODELS

class Task < ActiveRecord::Base 
    belongs_to :user 
    validates :name, :presence => true, :message => 'Name cannot be blank, Task not saved' 
end 

class User < ActiveRecord::Base 
    has_many :tasks 
end 

VIEWはそうのようなそれで呼び出しています user.tasks <を - タスクを通して、私ループ

問題:タスクモデルで

から

私が使用:

validates :name, :presence => true , :message => 'Name cannot be blank, Task not saved' 

私は500エラーを取得する:

ActionView::Template::Error (uninitialized constant User::Task): 
NameError in View file 

私が使用している場合:

validates_presence_of :name 

すべてが動作します。

上記の両方のバリデーション方法は、同じ問題がアソシエーションと関連しており、検証が関連するモデルとどのように関係しているかと考えました。私は物事が関連付けられている方法で何かが起こっていることを知っているが、それはちょうど馬鹿です。

ご協力いただければ幸いです。ありがとうございました。

答えて

48

新しいvalidates :name形式を使用する場合は、検証の種類ごとに複数の行を設定する必要はなく、複数の検証を1行にまとめることができます。このため、Railsが:messageパラメータにヒットした場合、それは:presenceに関連するメッセージではなく、検証方法と考えられます。

validates :name, :presence => {:message => 'Name cannot be blank, Task not saved'} 

また、エラーの表示方法によっては、このエラーが実際には「名前の名前は....ありません」と表示されることがあります。その場合は、メッセージを空白にすることはできません。タスクは保存されません。

+0

ありがとうございました!それはトリックでした! – RidingRails

+1

私はこれに関する国際化について質問します。 Railsがフィールド名を提供する場合、このエラーメッセージはどのように完全にローカライズされますか?たとえば、スペイン語では、「名前」は「nombre」である必要があります。デフォルトのメッセージを完全に抑制する方法はありますか? – jn29098

+0

これは古い投稿ですが、このエラーメッセージはどこに表示されるべきですか?フォームを送信した後などに表示されますか?ありがとうございました – Richlewis