2011-04-28 108 views
2

在我的更新用户配置文件表单中,第一个字段要求用户输入她当前的密码。当她提交表格时,我会先验证密码,然后再接受其他字段中的更改。下面是我当前如何做这在用户控制器:要求用户输入密码才能更新配置文件

def update 
    @user = User.find(params[:id]) 
    if @user.has_password?(params[:user][:password]) 
    if @user.update_attributes(params[:user]) 
     flash[:success] = "Profile updated." 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    else 
    flash[:failure] = "Password does not match!" 
    render 'edit' 
    end 
end 

我觉得有一个更好的方式来做到这一点。例如,我可以使密码匹配用户模型中的验证。然后formtastic会自动处理我的错误信息(而不是我上面的丑陋闪光方法)。我试着用

validate :password_match?, :on => :update 

而且

def password_match? 
    has_password(params[:user][:password]) 
end 

这样做,但被怀疑params为不从模型访问。

我搜索了20分钟的方法来做到这一点,找不到任何不涉及设计或Authlogic。我从头开始进行身份验证(一切工作正常:登录,会话等)。

请给我看看更好的方式!

+0

如果你使用[色器件(https://github.com/plataformatec/devise),这将是建立在你的[编辑用户注册视图(https://开头github上。 com/plataformatec/devise/blob/master/app/views/devise/registrations/edit.html.erb#L15) – Zabba 2011-04-28 18:18:40

+0

下一次我会确定使用devise。我最近学习了Rails,并参与了一个涉及从头开始构建认证的教程。自那以后,我一直在为我的项目编写代码。 – 2011-04-28 18:22:49

回答

1

您不需要设计,只需在您的控制器上使用before过滤器更新 在您的配置文件控制器上。

before_filter password_match, :only => :update 

然后在底部作为私人。


private 

def password_match 
    @user = User.find(params[:id]) 
    @user.has_password?(params[:user][:password]) 

+0

这条道路让我失望了一个兔子洞。将您拖入上下文可能不值得,但我们必须来回多次。我只会坚持我原来的解决方案。我认为这可能是因为我不知道如何正确使用errors.add将自定义错误添加到密码字段。无论如何,接受答案,因为这是一个很好的建议。 – 2011-04-28 22:18:30

+0

去喝杯咖啡,休息一会儿。你不需要errors.add,那么在屏幕顶部的闪烁错误怎么样?只需添加一个flash.now [:error] ='密码与您当前的密码不匹配'就是这样:) – daniel 2011-04-29 02:58:18

+0

这实际上是我原来的方法,请参阅上面的第一个代码示例。我决定坚持下去。 – 2011-05-15 00:37:16

相关问题