Odpowiedzi:
Możesz użyć validates_presence_of
http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of
class A < ActiveRecord::Base
has_many :bs
validates_presence_of :bs
end
lub po prostu validates
http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates
class A < ActiveRecord::Base
has_many :bs
validates :bs, :presence => true
end
Ale jest z nim błąd, jeśli będziesz używać accepts_nested_attributes_for
z :allow_destroy => true
: Modelami zagnieżdżonymi i walidacją nadrzędną . W tym temacie możesz znaleźć rozwiązanie.
-------- Szyny 4 ------------
Prosty validates
presence
działał dla mnie
class Profile < ActiveRecord::Base
belongs_to :user
validates :user, presence: true
end
class User < ActiveRecord::Base
has_one :profile
end
W ten sposób Profile.create
zakończy się niepowodzeniem. Muszę użyć user.create_profile
lub skojarzyć użytkownika przed zapisaniem pliku profile
.
Możesz zweryfikować powiązania za pomocą validates_existence_of
(która jest wtyczką):
Przykładowy fragment z tego wpisu na blogu :
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :taggable, :polymorphic => true
validates_existence_of :tag, :taggable
belongs_to :user
validates_existence_of :user, :allow_nil => true
end
Alternatywnie możesz użyć validates_associated
. Jak zauważa Faisal w komentarzach pod odpowiedzią, validates_associated
sprawdza, czy powiązany obiekt jest prawidłowy, uruchamiając walidację skojarzonej klasy. To ma nie sprawdzić obecność. Ważne jest również, aby pamiętać, że zerowe powiązanie jest uważane za ważne.
Jeśli chcesz mieć pewność, że skojarzenie jest obecne i gwarantowane, że będzie ważne, również musisz użyć
class Transaction < ActiveRecord::Base
belongs_to :bank
validates_associated :bank
validates :bank, presence: true
end
validates
polubieniavalid: true
zamiast dzwonićvalidates_associated
osobno.