2013-04-07 39 views
6

我正在开发一个使用Rails和Devise进行用户身份验证的应用程序。我想知道是否有办法只为了一些更改而要求密码。设计:仅在某些情况下要求密码

举例来说,我想询问密码时:

  • 删除帐户
  • 更改密码

而且我希望用户可以自由编辑等领域,而不任何密码,如:

  • 名称
  • 用户名
  • 阿凡达

所以,我想某种程度上,这两种方法之间切换。我该如何解决这个问题?

编辑:

在设计的文档,我发现这一点,它工作得很好,只允许更改密码,电子邮件,如果我输入密码:

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

    successfully_updated = if needs_password?(@user, params) 
     @user.update_with_password(params[:user]) 
    else 
     # remove the virtual current_password attribute update_without_password 
     # doesn't know how to ignore it 
     params[:user].delete(:current_password) 
     @user.update_without_password(params[:user]) 
    end 

    if successfully_updated 
     set_flash_message :notice, :updated 
     # Sign in the user bypassing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to after_update_path_for(@user) 
    else 
     render "edit" 
    end 

end 

private 

# check if we need password to update user data 
# ie if password or email was changed 
# extend this as needed 
def needs_password?(user, params) 
    user.email != params[:user][:email] || 
    !params[:user][:password].blank? 
    #HERE 
end 

现在,我能放什么#HERE到当我删除帐户时还需要密码?

+0

您不能添加任何'#HERE',因为'update'方法不会删除用户,它只会更新用户属性。你可能想要添加相同类型的东西到你的控制器 – ted 2013-04-07 20:51:25

回答

0

您可以创建一个form_tag重定向到您的控制器中的操作。

<%= form_tag url_for(:controller => :users, :action => :destroy), :method => :get do %> 
    <%= label_tag(:password, "Enter password before deleting") %> 
    <%= password_field_tag :password %> 
    <%= submit_tag "Delete User With Confirmation" %> 
<% end %> 

在UsersController的行动将是这样的:

def destroy 
    if current_user.authenticate(params[:password]) 
     #do something 
    else 
     #do something 
    end 
end 
3

由于问题编辑:

def destroy 
    if current_user.valid_password?(params[:user][:password]) 
    current_user.destroy 
    else 
    render "destroy" # or what ever 
    end 
end 
+0

中的'destroy'方法,它不要求输入密码,是吗? – Zippie 2013-04-07 20:21:17

+0

@ Zippie,“这种方法可以确保用户登录,如果没有将他们重定向到登录页面,”来源:http://asciicasts.com/episodes/210-customizing-devise – ted 2013-04-07 20:27:54

+0

Fran发表:“我想知道是否有一种方法只需要对密码进行一些更改。“ – Zippie 2013-04-07 20:28:40

0

有一个在设计一种destroy_with_password方法(因为3.5版本至少。 2)。它是在lib/devise/models/database_authenticatable.rb,由

destroy_with_password(current_password) 

称为它破坏了记录,如果current_password相匹配,否则,返回假。

相关问题