Password reset - niepotrzebne odpalanie custom validatora

Mam aplikację połączoną z zewnętrznym forum vbulletin.

W modelu user stworzyłem custom validator (sprawdza czy w bazie forum jest taki email badz username):

[code=ruby]validate :check_if_forum_user_exists

def check_if_forum_user_exists
if Vbuser.find_by_email(email.downcase)
errors.add(:email, “error 1”)
end

if !Vbuser.find(:all, conditions: [“lower(username) = lower(?)”,name]).empty?
errors.add(:name, “error 2”)
end
end[/code]
Moja funkcjonalnosc resetowania hasla jest bardzo prosta. W ostatnim kroku, użytkownik w formularzy wpisuje password i password_confirmation, które zapisywane są w params[:user].
W kontrolerze chcę to zapisać (to jest funkcjonalność z has_secure_password), czyli robię @user.update_attributes(params[:user]). Wszystkie validatory kończą się sukcesem, poza tym jednym który wrzuciłem wyżej. On się odpala i wyrzuca ten “error 1”. Problem jest z tym, że każdy użytkownik ma konto również na forum, więc bez sensu gdybym użytkownik nie mógł zresetować hasła z tego powodu.

Wiecie może jak to obejść? W ogóle nie rozumiem dlaczego to się uruchamia, a na przykład takie standardowe uniqueness dla name czy email już nie. Czy to w validatorze powinienem jakas taka kontrole zrobic, czy np. email albo username byl zmieniany?

Nie wiem czy dobrze rozumiem Twój problem, ale wydaje mi się, że (może o tym nie wiesz, ale) chcesz tę Twoją specjalną walidację odpalać jedynie przy tworzeniu użytkownika. Chyba tylko wtedy interesuje Cię czy istnieje użytkownik forum i sprawdzasz username. Bo jeżeli każdemu użytkownikowi tworzysz konto na forum, to taka walidacja uniemożliwiałaby jakąkolwiek zmianę danych później.

Jeśli dobrze to zrozumiałem, to rozwiązaniem byłoby:

validate : check_if_forum_user_exists, :on => :create

Tak, mniej więcej o to mi chodziło, niestety walidacja musi się odpalać także w momencie gdy np. użytkownik zmienia mail.
Obszedłem to trochę inaczej, dałem w ifach name_changed? i email_changed?, nie wiem czy to w zgodzie ze “sztuką” railsową, ale działa.

[code=ruby] def check_if_forum_user_exists
if self.email_changed? && Vbuser.find_by_email(email.downcase)
errors.add(:email, “jest juz zajety”)
end

if self.name_changed? && !Vbuser.find(:all, conditions: ["lower(username) = lower(?)",name]).empty?
  errors.add(:name, "jest juz zajety")
end

end[/code]
ps. komunikaty błędów będą później wrzuceno do l18n