我有一个自定义控制器,可根据代码here处理用户密码的编辑。
用户模型
attr_accessible :password, :password_confirmation, :username, :login
...
devise :database_authenticatable,
:lockable,
:registerable,
:recoverable,
:rememberable,
:trackable
PasswordsController
expose(:user) { current_user }
def update
if user.update_with_password(params[:user])
sign_in(user, :bypass => true)
flash[:notice] = "success"
else
render :edit
end
end
我的修改密码表单位于here。
问题在于,无论我输入(或不输入内容)到编辑密码表单中,都会显示“成功”闪存方法。
答案 0 :(得分:68)
如果您希望Devise进行验证,则需要将:validatable
模块添加到模型中。这很容易做到,只需将:validatable
添加到devise
调用中的模块列表中,因此您的模型会说:
devise
:database_authenticatable,
:lockable,
:registerable,
:recoverable,
:rememberable,
:trackable,
:validatable
这将使设计添加验证。
另一种简单的方法是添加自己的验证。如果您只是想验证密码确认是否匹配,可以通过将其添加到模型中来添加validates_confirmation_of
验证:
validates_confirmation_of :password
我希望这会有所帮助。
答案 1 :(得分:5)
我认为您忘记在rails 4
中的application_controller.rb中初始化强参数before_action:configure_permitted_parameters,if :: devise_controller? 受保护的
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up){|u|u.permit(:email,:password,:password_confirmation)}
end
答案 2 :(得分:1)
在控制器中找到要更新的对象。
user = User.find_by_id(params[:id])
unless user.blank?
if user.update_attributes(params[:user])
flash[:notice] = "User updated successfully."
redirect_to "somwhere"
else
render :action => 'edit'
end
else
render :action => 'edit'
end
如果您不想更新旧密码,请在更新前添加这些行,以便新代码为:
user = User.find_by_id(params[:id])
unless user.blank?
params[:user].delete(:password) if params[:user][:password].blank?
params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank?
if user.update_attributes(params[:user])
flash[:notice] = "User updated successfully."
redirect_to "somwhere"
else
render :action => 'edit'
end
else
render :action => 'edit'
end
在user.rb模型中写下这样的东西
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :locakable