要求用户输入密码才能更新配置文件
在我的更新用户配置文件表单中,第一个字段要求用户输入她当前的密码。当她提交表格时,我会先验证密码,然后再接受其他字段中的更改。下面是我当前如何做这在用户控制器:要求用户输入密码才能更新配置文件
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。我从头开始进行身份验证(一切工作正常:登录,会话等)。
请给我看看更好的方式!
您不需要设计,只需在您的控制器上使用before过滤器更新 在您的配置文件控制器上。
before_filter password_match, :only => :update
然后在底部作为私人。
private
def password_match
@user = User.find(params[:id])
@user.has_password?(params[:user][:password])
这条道路让我失望了一个兔子洞。将您拖入上下文可能不值得,但我们必须来回多次。我只会坚持我原来的解决方案。我认为这可能是因为我不知道如何正确使用errors.add将自定义错误添加到密码字段。无论如何,接受答案,因为这是一个很好的建议。 – 2011-04-28 22:18:30
去喝杯咖啡,休息一会儿。你不需要errors.add,那么在屏幕顶部的闪烁错误怎么样?只需添加一个flash.now [:error] ='密码与您当前的密码不匹配'就是这样:) – daniel 2011-04-29 02:58:18
这实际上是我原来的方法,请参阅上面的第一个代码示例。我决定坚持下去。 – 2011-05-15 00:37:16
如果你使用[色器件(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
下一次我会确定使用devise。我最近学习了Rails,并参与了一个涉及从头开始构建认证的教程。自那以后,我一直在为我的项目编写代码。 – 2011-04-28 18:22:49