2011-02-22 13 views
23

Mam kilka prostych modeli, które są powiązane w taki sposób:potwierdza: obecność vs validates_presence_of za pomocą szyn 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 ma połączenie w nim tak: user.tasks < - potem pętli zadań

problem:

W modelu zadanie -

kiedy używam:

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

dostaję błąd 500:

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

kiedy używam:

validates_presence_of :name 

Wszystko działa.

Myślałem, że oba potwierdzają metody powyżej, gdzie ten sam ... jest problem związany ze skojarzeniami i jak walidacja wiąże się z odpowiednimi modelami. Mam przeczucie, że coś się dzieje z tym, jak rzeczy są powiązane, ale to tylko przeczucie.

Każda pomoc zostanie doceniona. Dziękuję bardzo.

Odpowiedz

48

Gdy używasz nowszego formatu validates :name, możesz umieścić wiele sprawdzeń w jednym wierszu, zamiast mieć wiele wierszy dla każdego typu sprawdzania poprawności. Z tego powodu, gdy Rails uderza w Twój parametr :message, uważa, że ​​jest to metoda sprawdzania poprawności, a nie komunikat związany z :presence. Spróbuj zamiast tego:

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

Ponadto, w zależności od sposobu wyświetlania błędów, błąd ten może się pojawić jako "Nazwa Nazwa nie może być ..."; jeśli tak, będziesz chciał ustawić komunikat tak, aby "nie mógł być pusty, zadanie nie zostało zapisane".

+0

Wielkie dzięki! To wystarczy! – RidingRails

+1

Mam pytanie dotyczące internacjonalizacji w związku z tym. Jeśli Rails dostarcza nazwę pola, w jaki sposób ten komunikat o błędzie może być całkowicie zlokalizowany? Na przykład w języku hiszpańskim "nazwa" powinna być "nombre". Czy istnieje sposób całkowitego zablokowania domyślnego komunikatu? – jn29098

+0

Wiem, że jest to stary post, ale gdzie powinien być wyświetlany ten komunikat o błędzie i czy jest wyświetlany po przesłaniu formularza? Dziękuję Ci – Richlewis

Powiązane problemy