2012-04-05 3 views
0

У меня есть форма с полями password, password_confirmation и current_password, и когда я пытаюсь ее обновить, он не изменяет пароль в db. Я только хочу обновить пароль с помощью текущего пароля и обновить другие поля, такие как имя, адрес электронной почты и фамилию без текущего пароля ... Я много борется с этим, и я не знаю, где я ' m wrong ... Поле электронной почты, имя и фамилия могут быть обновлены, но пароль не указан, он перенаправляет меня только на корневую страницу!Не удается обновить пароль с помощью программы?

Это модель:

attr_accessible :name,:email,:lastname,:password,:password_confirmation,:current_password,:remember_me 

validates :name,:presence=>true, 
       :length=>{:maximum=>50} 

validates :lastname,:presence=>true, 
        :length=>{:maximum=>50} 


def update_with_password(params={}) 
    current_password = params.delete(:current_password) 


    if params[:password].blank? 
     params.delete(:password) 
     params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 

    result = if valid_password?(current_password) 
    update_attributes(params) 
    else 
     self.attributes = params 
     self.valid? 
     self.errors.add(:current_password, current_password.blank? ? :blank : :invalid) 
     false 
    end 

    clean_up_passwords 
    result 
    end  

    def update_without_password(params, *options) 
    params.delete(:password) 
    params.delete(:password_confirmation) 

    result = update_attributes(params, *options) 
    clean_up_passwords 
    result 
    end     

Это мой контроллер регистрации:

class RegistrationsController < Devise::RegistrationsController 
def edit 
@user = current_user 
end 

def update 
@user = User.find(current_user.id) 

if @user.update_without_password(params[:user]) 
    # Sign in the user by passing validation in case his password changed 
    sign_in @user, :bypass => true 
    flash[:success]="Profile updated" 
    redirect_to edit_user_registration_path(current_user.id) 
else 
    render "edit" 
end 

конец конец

Мои пароли контроллера:

class PasswordsController < Devise::PasswordsController 
before_filter :authenticate_user! 

def edit 
@user = current_user 
end 

def update 
@user = current_user 
# raise params.inspect 
    if @user.update_with_password(params[:user]) 
    sign_in @user,:bypass=>true 
    flash[:success]="You already changed your pass" 
    redirect_to edit_user_password_path(current_user.id) 
else 
    render :edit 
end 
end 
end 

Мои пароли вид редактирования:

<h2>Change your password</h2> 
<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %> 
<%= devise_error_messages! %> 
<%= f.hidden_field :reset_password_token %> 
<div><%= f.label :current_password, "Old password" %><br /> 
<%= f.password_field :current_password %></div> 

<div><%= f.label :password, "New password" %><br /> 
<%= f.password_field :password %></div> 
<div><%= f.label :password_confirmation, "Confirm new password" %><br /> 
<%= f.password_field :password_confirmation %></div> 
<div><%= f.submit "Change my password" %></div> 
<% end %> 
<%= render :partial => "devise/links" %> 

Я был бы признателен за помощь я застрял в них на некоторое время ...

ответ

0

Вы не сохраните пользователя в контроллере.

Вы можете сделать это в своем методе update_without_password или в своем контроллере.

def update_with_password(params={}) 
    current_password = params.delete(:current_password) 


    if params[:password].blank? 
     params.delete(:password) 
     params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end 

    result = if valid_password?(current_password) 
    update_attributes(params) 
    else 
     self.attributes = params 
     self.valid? 
     self.errors.add(:current_password, current_password.blank? ? :blank : :invalid) 
     false 
    end 

    clean_up_passwords 
    result 
    save 
    end 
Смежные вопросы