2012-08-06 116 views
1

在我的ruby on rails项目中,我使用devise作为身份验证插件。现在,我已经添加了更改密码功能项目,并提交表单的时候,我得到一个错误No route matches "https://stackoverflow.com/users/update_password"在Ruby on Rails中没有路由匹配

这是我更新密码的代码

def update_password 
    @user = User.find(current_user.id) 
    if @user.update_attributes(params[:user]) 
     # Sign in the user by passing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to root_path 
    else 
     render "edit" 
    end 
    end 

这是我的路线详情

resources :users, :only => [] do 
     collection do 
      get 'current' 
      get 'edit' 
      post 'update_password' 
     end 
    end 

,这是我的编辑形式

<div id="loginForm"> 
    <div id="loginHeader"><h3>Change Password</h3></div> 
    <div id="loginContent"> 
     <%= form_for(@user, :url => { :action => "update_password" }) do |f| %> 
      <p><%= f.password_field :current_password, :class => "login_txt", :placeholder => "We need your current password to confirm your changes", :autocomplete => "off" %></p> 
      <p><%= f.password_field :password, :class => "login_txt", :placeholder => "New password", :autocomplete => "off" %></p> 
      <p><%= f.password_field :password_confirmation, :class => "login_txt", :placeholder => "Confirm password", :autocomplete => "off" %></p> 
      <p> 
       <input id="user_submit" name="commit" type="submit" value="Update Password" class="login_btn" /> 
      </p> 
     <% end %> 
    </div> 
</div> 

人帮助我如何解决这个问题

非常感谢

+1

可以运行'耙路线“并粘贴与Devise相关的输出? – 2012-08-06 05:19:38

回答

2

在你routes.rb定义update_password作为集合(/users/update_password)一个POST操作,但在你的表格,你是隐其定义为一个PUT操作时您由于@user已经存在,因此将@user传递给form_for

我没有测试过这一点,但我相信,改变你的收集路线从POST到PUT应该解决这个问题:

resources :users, :only => [] do 
    collection do 
    get 'current' 
    get 'edit' 
    put 'update_password' 
    end 
end 

参见:Rails 3.0.10, customer routes, post and form_for tag

+0

非常感谢,现在提到的错误是固定的,但密码不更新 – Mujahid 2012-08-06 05:35:09

+0

我不使用自己设计,所以我不知道它是如何工作的,但也许问题是'password'属性受到保护?如果是这种情况,您需要在用户模型中添加'attr_accessible:password,:password_confirmation',或者您可以显式地在控制器代码中设置属性。 – 2012-08-06 05:45:13

+1

也尝试将'update_attributes'更改为'update_attributes!'并查看它返回的错误。 – 2012-08-06 05:46:49