Zmiana hasła

Cześć wszystkim. Chciałbym was poprosić o pomoc, otóż…

Obecnie powróciłem do Railsów po długiej przerwie i pragnę sobie co nieco przypomnieć. Chciałem zrobić zmianę hasła - wszystko fajnie - zrobiłem sprawdzenie poprzez wpisanie obecnego hasła i … no właśnie - kiedy chcę zmienić inny rekord niż hasło jest dobrze, ale nie za bardzo wiem jak napisać sprawdzenie poprawności nowego hasła i zapisanie go do bazy. Proszę o wytłumaczenie lub ew. podrzucenie info dot. czegoś takiego, będę wdzięczny. Najlepiej byłoby na jakimś przykładzie dosyć prostym i zrozumiałym.

A tutaj jak wygląda mój kod:
https://github.com/bangeusz/bsrp/blob/master/app/models/player.rb

!self.password.nil? ci załatwi validates_presence_of (już bez zastrzeżenia że tylko on create).

Porównywanie haszy to bardzo defensywne programowanie, w tym wypadku redundantny kod.
Zostaw encrypt_password (chociaż lepiej jako before_validate zamiast before_save) i przykryj to sobie unittestami, zamiast za każdym razem kazać aplikacji sprawdzać czy aby na pewno działa.

Jakoś sobie poradziłem, tyle, że teraz mam całkiem inny problem. Otóż chcę, aby zmiana avatara odbywała się bez wpisywania obecnego hasła (a już napewno nie nowego), wiem, że problem tkwi w walidacji, bo wszystkie zmiany w modelu Player przechodzą przez akcję update. W walidacji mam on => :update, nie mam pomysłu jak to zrobić, bo tak czy owak przechodzi przez update (gdzie sprawdzana jest walidacja obecnego i nowych haseł) Co zrobić w takiej sytuacji?

Wklej to do swojego modelu:

protected def password_required? !persisted? || password.present? || password_confirmation.present? end

Z tego co się na szybko przyjrzałem - przy każdym updacie robisz walidacje związaną z hasłem (confirmation itp.). Zrób oddzielną metodę tylko do updatu hasła i tam sobie ręcznie wywołaj te walidacje

[code=ruby]def change_password(new_password, new_password_confirmation)
raise(Exception, “Password can’t be nil”) if new_password.nil?

if new_password == new_password_confirmation && new_password != password
self.password = new_password
save
end
end[/code]
mniej więcej coś takiego :wink:

wtedy możesz wywalić wszystkie walidacje związane z hasłem (przy updacie) i wszystko (poza hasłem) updatować normalnie.

p.s. rozumiem, że piszesz do od podstaw w ramach nauki? jeżeli nie, to pomyśl nad Devise (to ci generuje modele, widoki, kontrolery, routes’y itd.) lub Sorcery (to ci generuje tylko odpowiedni model + helpery ale widoki i kontrolery piszesz sam). Ewentualnie has_encrypted_password z Rails > 3.1 :wink: