validates_presence_of w zależności od wybranej opcji

He,

Mam taki kod

[code]class AppConfig < ActiveRecord::Base
attr_accessible :app_id, :is_comment, :is_visibility, :notification, :is_ranking, :awards_count, :awards

validates_presence_of :is_comment, :on => :update
validates_presence_of :is_visibility, :on => :update
validates_presence_of :notification, :on => :update
validates_presence_of :is_ranking, :on => :update
validates_presence_of :awards, :on => :update, :if => ‘is_ranking = 1’

belongs_to :app

after_update :after_update

def after_update
#add progres
AppProgres.insert_progres self.id, ‘config_step_2’, 10
end

end[/code]
Chcę by :awards był validowany TYLKO w przypadku kiedy is_ranking=1 jak to zrobić?

if: Proc.new{|c| c.is_ranking == 1}

validates_presence_of :awards, :on => :update, if: Proc.new{|c| c.is_ranking == 1}

nie działa (w ogóle nie validuje)

czy czasem, “Proc.new{|c| c.is_ranking == 1}” nie będzie sprawdzać tego co mamy w bazie a ja bym chciał żeby sprawdzał co leci z formularza i jak w formularzy w select wybieramy opcję gdzie is_ranking==1 to validuje dwa dodatkowe pola.

  validates_presence_of :awards, :on => :update,  :if =>  Proc.new { :is_ranking == 1 }

tez nie działa :confused:

Jeżeli leci z formularza to masz to w stringu więc spróbuj == ‘1’ . Chociaż pewności nie mam , ale od tego bym zaczął ;]

już próbowałem. nic z tego :confused: będę szukał i dam znać może komuś się przyda (o ile do tego dojdę:)

Jeżeli is_ranking to boolean, to twoje jedyneczki sa pewnie konwertowane do true.

validates_presence_of :awards, :on => :update,  :if => :is_ranking?

btw is_ranking brzmi pokracznie, albo is_ranked albo has_rank/ing…

[quote=piotrstanek]validates_presence_of :awards, :on => :update, if: Proc.new{|c| c.is_ranking == 1}
nie działa (w ogóle nie validuje)

czy czasem, “Proc.new{|c| c.is_ranking == 1}” nie będzie sprawdzać tego co mamy w bazie a ja bym chciał żeby sprawdzał co leci z formularza i jak w formularzy w select wybieramy opcję gdzie is_ranking==1 to validuje dwa dodatkowe pola.[/quote]
ten kod jest poprawny i działa tak jak powinien, tj. wykonuje walidację. Musisz mieć błąd w innym miejscu, jeżeli uważasz że się nie wykonuje to ustaw warunek na “true”, wtedy zawsze musi się wykonać.
Jak dalej się nie wykonuje to w warunku wyrzuć wyjątek. Jak wyjątek wyskakuje to dobrze oznacza że i walidacja się wykonuje. Jak wyjątku nie ma to masz problem w callbacku (update?).

potestuj z poziomu konsoli, będzie łatwiej.

może problem w tym, że ja tutaj korzystam z gem’a ‘client_side_validations’ dlatego takie cuda

masz w opisie Gema.

dzięki