2013-04-04 11 views
6

W tej chwili za każdym razem, gdy zmieniam cokolwiek w użytkowniku/edycji, formularz wymaga od użytkownika ustawienia nowego hasła. Chciałbym, aby wymagało obecnego hasła (w jaki sposób mogę poprosić o aktualne hasło?) Tylko po wprowadzeniu nowego hasła. Jak mogę to osiągnąć, wielkie dzięki za to.Wymagaj starego hasła, aby wprowadzić nowe hasło

<%= form_for(@user, :html => {:multipart => true}) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <%= f.text_field :name, placeholder: :name %> 
    <%= f.text_field :email, placeholder: :email %> 
    <%= f.password_field :password, placeholder: "Enter new password" %> 
    <%= f.password_field :password_confirmation, placeholder: "Confirm new password" %> 
    <%= f.submit "Save changes", class: "btn btn-large btn-primary" %> 
<% end %> 

Odpowiedz

6

Korzystanie pewne informacje od rails_has_elegance i wstęgi wymyśliłem z następującym rozwiązaniem.

użytkownik view/edit: model

<%= form_for(@user, :html => {:multipart => true}) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <%= f.text_field :name, placeholder: :name %> 
    <%= f.text_field :email, placeholder: :email %> 
    <%= password_field_tag :current_password, params[:current_password], placeholder: "Current password" %> 
    <%= f.password_field :password, placeholder: "New password (optional)" %> 
    <%= f.password_field :password_confirmation, placeholder: "Confirm new password" %> 
<% end %> 

użytkownika: kontroler

validates :password, :on => :create 
validates :password_confirmation, presence: true, :on => :update, :unless => lambda{ |user| user.password.blank? } 

użytkownika:

def update 
    @user = User.find(params[:id]) 
    user = User.find_by_email(current_user.email).try(:authenticate, params[:current_password]) 
    if user && @user.update_attributes(params[:user]) 
    flash[:success] = "Profile updated" 
    sign_in @user 
    redirect_to @user 
    else 
    flash.now[:error] = "Incorrect Current Password" unless user 
    sign_in @user 
    render 'edit' 
    end 
end 
1

Można utworzyć oddzielny formularz do zmiany hasła. I można poprosić o aktualne hasło jak poprosić o nową:

<%= form_for(@user, :html => {:multipart => true}) do |f| %> 
    <%= f.password_field :password, placeholder: "Enter current password" %> 
    <%= f.password_field :password, placeholder: "Enter new password" %> 
    <%= f.password_field :password_confirmation, placeholder: "Confirm new password" %> 
    <%= f.submit "Save changes", class: "btn btn-large btn-primary" %> 
<% end %> 
+0

ja nie uzyskiwanie jak może pomóc? –

2

Można dodać w formularzu pola old_password

<%= f.password_field :old_password, placeholder: "Enter current password" %> 

Dodaj go do attr_accessible :old_password i attr_accessor :old_password

A następnie można go zweryfikować:

validate :correct_old_pass, :on => :update 

def correct_old_pass 
    errors[:old_password] << 'Incorrect pass' if your_check_method 
end 
+0

Zakładam, że powinienem jednak uzyskać dostęp do modelu użytkownika? jeszcze nieodkryty atrybut. Nie potrzebuję również metody sprawdzania starego hasła. coś w stylu <% = f.password_field @ user.authenticate ([: hasło]), symbol zastępczy: "Wprowadź bieżące hasło"%> ma jakiś sens? – Jaqx

+0

dodaj do swojej attr_accessible listy w modelu: old_password, wtedy będzie dostępna jako atrybut w modelu i możesz ją zweryfikować –

+0

<% = f.password_field @ user.authenticate ([: hasło]), symbol zastępczy: "Wprowadź bieżące hasło" %> ma sens? Wydaje mi się, że to nie ma sensu –

1

Proponuję dokonywania dodatkowej edit_password i działania update_password za to w swojej users_controller:

@user = User.find(params[:id]) 
user = User.find_by_email(current_user.email).try(:authenticate, params[:current_password]) 
if user && @user.update_attributes(params[:user]) 
    flash[:success] = "Password updated!" 
    (sign_in @user) 
    redirect_to ... 

w formularzu wystarczy użyć następujących polach:

<%= label_tag :current_password, "Current password:" %> 
    <%= password_field_tag :current_password, params[:current_password] %> 

    <%= form.label :password, "New password:" %> 
    <%= form.password_field :password %> 

    <%= form.label :password_confirmation, "Confirm new password" %> 
    <%= form.password_field :password_confirmation %> 
+0

Gdy wprowadzam bieżące hasło niepoprawnie nie otrzymuję komunikatów o błędach z renderowania "shared/error_messages", object: f.object – Jaqx

+0

to prawda, możesz to zrobić ręcznie za pomocą lampy błyskowej [: error] = "" –

+0

Po prostu to zrobiłeś, musi to być flash.now, więc pozostaje tylko dla prądu strona – Jaqx

Powiązane problemy