2011-07-01 17 views
29

Mam niestandardowy kontroler, który obsługuje edycję haseł użytkowników na podstawie kodu here.Devise Niepotwierdzenie hasła/potwierdzenie hasła

Użytkownik modelu

attr_accessible :password, :password_confirmation, :username, :login 
... 
devise :database_authenticatable, 
     :lockable, 
     :registerable, 
     :recoverable, 
     :rememberable, 
     :trackable 

PasswordsController

expose(:user) { current_user } 

def update 
    if user.update_with_password(params[:user]) 
    sign_in(user, :bypass => true) 
    flash[:notice] = "success" 
    else 
    render :edit 
    end 
end 

Moja edycja forma hasło znajduje się here.

Problem polega na tym, że bez względu na to, co wprowadzę (lub nie wprowadzę w tym celu) do formularza edycji hasła, zostanie wyświetlona metoda "sukces" flashowania.

+0

Czy to wszystko działa, jak powinno? jeśli pole potwierdzenia się nie zgadza lub hasło jest nieprawidłowe, to nie zmienia hasła? – Dex

+0

Nadal zmienia to, co jest w: hasło bez względu na to, co (jeśli coś) znajduje się w: password_confirmation. –

+0

co się stanie, jeśli zmienisz instrukcję if na 'jeśli params [: user] [: password] == params [: user] [: password_confirmation]' i wstawisz 'user.update_with_password (parametry [: user])' w treści ? –

Odpowiedz

62

Jeśli chcesz, aby program Devise przeprowadzał sprawdzanie poprawności, musisz dodać do swojego modelu moduł :validatable. Jest to dość łatwe do zrobienia, po prostu dodaj :validatable do listy modułu w wezwaniu devise, więc model mówi:

devise 
    :database_authenticatable, 
    :lockable, 
    :registerable, 
    :recoverable, 
    :rememberable, 
    :trackable, 
    :validatable 

to uczyni Devise dodać walidację.

Innym prostym sposobem jest dodanie własnych sprawdzeń. Jeśli tylko chcesz, aby potwierdzić, że potwierdzenie hasło pasuje, można dodać walidację validates_confirmation_of dodając do tego modelu:

validates_confirmation_of :password 

Mam nadzieję, że to pomaga.

+1

'validates_confirmation_of: password' było tym, czego mi brakowało –

1

znajdź swój obiekt do aktualizacji w kontrolerze.

user = User.find_by_id(params[:id]) 
    unless user.blank? 
     if user.update_attributes(params[:user]) 
     flash[:notice] = "User updated successfully." 
     redirect_to "somwhere" 
     else 
     render :action => 'edit' 
     end 
    else 
     render :action => 'edit' 
    end 

jeśli nie chcesz zaktualizować stare hasło, a następnie dodać te linię przed updation więc nowy kod będzie:

user = User.find_by_id(params[:id]) 
     unless user.blank? 
      params[:user].delete(:password) if params[:user][:password].blank? 
      params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 
if user.update_attributes(params[:user]) 
      flash[:notice] = "User updated successfully." 
      redirect_to "somwhere" 
      else 
      render :action => 'edit' 
      end 
     else 
      render :action => 'edit' 
     end 

zapisu somthing jak ten w modelu user.rb

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :locakable 
4

Chyba zapomniałeś zainicjować silny parametru application_controller.rb w szynach 4

before_action: configure_permitted_parameters, jeżeli:: devise_controller? chronione

def configure_permitted_parameters  
    devise_parameter_sanitizer.for(:sign_up){|u|u.permit(:email,:password,:password_confirmation)} 
end 
+1

Właśnie o mnie, zapomniałem dodać' password_confirmation' do listy odkażonych parametrów, dzięki! – hernandes

Powiązane problemy