2011-07-07 21 views
5

Intento utilizar el dispositivo en mi aplicación Rails. Pero no entiendo cómo puedo dar la funcionalidad del usuario para cambiar su contraseña. Necesito un formulario con los campos "contraseña anterior", "nueva contraseña" y "nueva confirmación de contraseña". ¿Cómo puedo hacerlo?Rails 3 Diseñar cambiar manualmente la contraseña

si uso legado forma predeterminada en "/ perfil"

<%= render :template => 'devise/passwords/edit', 
         :locals => { 
          :resource => my_user_model_variable, 
          :resource_name => my_user_model_name } %> 

En user.rb contienen línea

attr_accessible :email, :password, :password_confirmation, :remember_me 

pero no había undefined method 'devise_error_messages!' for #<#<Class:0x59b9200> y luego (después de comentar devise_error_messages! Line) undefined method 'password' for #<Class:0x59b9200> errores.

trato de usar mi propia PasswordsController:

class PasswordsController < ApplicationController 
    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) 
     redirect_to root_path, :notice => "Password updated!" 
    else 
     render :edit 
    end 
    end 
end 

y utilizar el asesoramiento de esta pregunta: Rendering the Devise edit Password Form

insertar este código

<%= render :template => 'passwords/edit', 
        :locals => { 
         :resource => current_user, 
         :resource_name => User } %> 

en la página "/ perfil".

contraseñas/edit.html.erb contienen este código

<h2>Change your password</h2> 
<%# raise resource.inspect %> 
<%= 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 %> 

    <p><%= f.label :password, "New password" %><br /> 
    <%= password_field_tag :name => "user[password]"%></p> 
    <%= password_field_tag :name => "user[password_confirmation]"%></p> 

    <p><%= f.submit "Change my password" %></p> 
<% end %> 

<%= render :partial => "devise/shared/links" %> 

Pero tiene un valor dictada forma "/ perfil" para el atributo acción y enviar este formulario no hacen nada.

+1

Debe aceptar una de estas respuestas si es correcta. –

Respuesta

0

¿Qué pasa si se agrega comillas alrededor del usuario, tales como:

<%= render :template => 'passwords/edit', 
        :locals => { 
         :resource => current_user, 
         :resource_name => "User" } %> 
+0

Ahora tengo un error "Método no definido' User_password_path '". – Ardentum

+0

Creo que el problema está en acceder al "recurso" desde un controlador diferente que un controlador Devise. Intenta hacer que PasswordsController herede del Devise PasswordsController. – joseph

11

Su forma debe ser, es decir, contraseña/edit.html.erb

<%# raise resource.inspect %> 
<%= 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 %> 

    <p><%= f.label :current_password %><br /> 
    <%= f.password_field :current_password %></p> 

    <p><%= f.label :password, "New password" %><br /> 
    <%= f.password_field :password %></p> 

    <p><%= f.label :password_confirmation, "Confirm new password" %><br /> 
    <%= f.password_field :password_confirmation %></p> 

    <p><%= f.submit "Change my password" %></p> 
<% end %> 

VISTA:

<h3>Change password </h3> 
<hr/> 
<%= render :template => 'passwords/edit', 
        :locals => { :resource => current_user, :resource_name => "user" } %> 

controlador:

class PasswordsController < ApplicationController 
    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) 
     redirect_to root_path, :notice => "Your Password has been updated!" 
    else 
     render :edit,:locals => { :resource => @user, :resource_name => "user" } 
    end 
    end 
end 

Rutas:

devise_for :users ,:controllers => {:passwords => "passwords"} do 
    end 

    resources :passwords 

Funciona para mí;

Cuestiones relacionadas