Walidacja przypisanego modelu czy istnieje

witam
jak moge sprawdzic czy powiazany model istnieje, np mam w jakimś modelu

belongs_to :user validates_associated :user, :unless => Proc.new { |p| p.user_id.nil? }
pozwala zapisać model nawet jeśli podam id nieistniejącego usera, dlaczego ?

validates_presence_of :user

?

validates_existence_of

Dzięki za oba rozwiązania. to z validates_presence_of okazało się wystarczające

Chciałbym pozostawic walidacje przypisanych modeli w modelu nadrzędnym, ale czasem chciałbym cos zapisać do modelu narzędnego pomijając te walidacje (bo na początku nie ma przypisanych modeli). Czy to możliwe ?

Wszystko jest możliwe przy walidacji customowym blokiem/metodą :wink:

hmm, ale w modelu nie mam dostępu do informacji w jakim kontrolerze zapis został wywołany więc czy sprawdzać czy nie

Jeśli wywołasz save przekazując false jako argument ( save(false) ) to rekord zostanie zapisany z pominięciem walidacji.

to wiem, ale ja nie chciałbym pomijać walidacji rekordu samego w sobie, tylko przypisanych do niego rekordów. Np.

[code=ruby]class Survey < ActiveRecord::Base
has_many :pages, :dependent => :destroy, :order => :position

validates_presence_of :title
validates_length_of :title, :within => TITLE_LENGTH, :unless => Proc.new {|s| s.title.blank? }

validates_presence_of :pages, :on => :update
validates_associated :pages, :on => :update[/code]
Żeby przy pewnej akcji zwalidowało objekt survey ale nie walidowało pages. Nie używając :allow_blank => true bo ogólnie to chciałbym żeby walidowało, tylko czasem wyjątek.

Narazie znalazłem takiego niezbyt pięknego hacka, odp 1

i trochę bardziej eleganckie rozwiązanie

http://www.tonyamoyal.com/2009/12/03/ruby-on-rails-skipping-validations-based-on-where-object-is-created/

O, w komentarzach jest dobry przykład jak to powinno wyglądać.
Jest ktoś chętny do napisania odpowiedniego plug-inu?
Jeśli nie będzie nikogo to spróbuję sam się za to zabrać. Ot, takie poważniejsze “hello world” będzie :wink:

v = Venue.new v.validations_to_skip! :country, :region, :city, :zip v.name = "A Venue" v.user = some_user v.save

validates_presence_of :name validates_presence_of :country_id, :skippable => true validates_presence_of :region_id, :skippable => true validates_presence_of :city, :skippable => true validates_presence_of :zip, :skippable => true

coś takiego to moim skromnym zdaniem w railsach powinno sie znaleźć, ale jako plugin też było by super :slight_smile: to z przykładu sprawdziłem i działa ok