2011-07-07 37 views
5

Tôi cố gắng sử dụng trong ứng dụng đường ray của mình. Nhưng tôi không hiểu làm thế nào tôi có thể cung cấp cho người dùng chức năng để thay đổi mật khẩu của mình. Tôi cần một biểu mẫu với các trường "mật khẩu cũ", "mật khẩu mới" và "xác nhận mật khẩu mới". Tôi làm nó như thế nào?Rails 3 Thiết lập thủ công thay đổi mật khẩu

Nếu tôi sử dụng hình thức devise mặc định trên "/ profile" trang

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

Trong user.rb chứa dòng

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

Nhưng có undefined method 'devise_error_messages!' for #<#<Class:0x59b9200> và sau đó (sau khi cho ý kiến ​​devise_error_messages! Line) undefined method 'password' for #<Class:0x59b9200> lỗi.

tôi cố gắng sử dụng PasswordsController của riêng tôi:

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 

và sử dụng tư vấn từ câu hỏi này: Rendering the Devise edit Password Form

chèn mã này

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

vào trang "/ profile".

mật khẩu/edit.html.erb chứa mã này

<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" %> 

Nhưng render hình thức có "/ profile" giá trị cho thuộc tính hành động và submiting hình thức này không làm gì cả.

+1

Bạn nên chấp nhận một trong các câu trả lời này nếu đúng. –

Trả lời

0

gì sẽ xảy ra nếu bạn thêm dấu ngoặc kép quanh dùng, như vậy:

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

Bây giờ tôi có lỗi "phương thức undefined" User_password_path '". – Ardentum

+0

Tôi nghĩ rằng vấn đề là trong việc truy cập "tài nguyên" từ một bộ điều khiển khác với bộ điều khiển Devise. Hãy thử làm cho PasswordsController của bạn kế thừa từ Devise PasswordsController. – joseph

11

hình thức của bạn nên được tức là mật khẩu/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 %> 

XEM:

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

khiển:

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 

đường:

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

    resources :passwords 

Nó hoạt động đối với tôi;

Các vấn đề liên quan