Ruby on rails 设计更改密码不工作(未知属性:当前密码)
我不太确定我做错了什么,但当用户试图在我的应用程序上更改他们的密码时,它会给出一个错误,即当前密码是未知属性 这是我的密码:Ruby on rails 设计更改密码不工作(未知属性:当前密码),ruby-on-rails,devise,Ruby On Rails,Devise,我不太确定我做错了什么,但当用户试图在我的应用程序上更改他们的密码时,它会给出一个错误,即当前密码是未知属性 这是我的密码: def configure_devise_permitted_parameters registration_params = [:email, :password, :password_confirmation, :first_name, :last_name] if params[:action] == 'update' devise_paramet
def configure_devise_permitted_parameters
registration_params = [:email, :password, :password_confirmation, :first_name, :last_name]
if params[:action] == 'update'
devise_parameter_sanitizer.for(:user_update) {
|u| u.permit(registration_params << :current_password)
}
elsif params[:action] == 'create'
devise_parameter_sanitizer.for(:sign_up) {
|u| u.permit(registration_params)
}
end
end
class RegistrationsController < Devise::RegistrationsController
def update
account_update_params = devise_parameter_sanitizer.sanitize(:user_update)
if account_update_params[:password].blank?
account_update_params.delete("password")
account_update_params.delete("password_confirmation")
account_update_params.delete("current_password")
end
@user = User.find(current_user.id)
if @user.update_attributes(account_update_params)
set_flash_message :notice, :updated
sign_in @user, bypass: true
redirect_to after_update_path_for(@user)
else
render "edit"
end
end
不要调用
@user.update\u attributes(account\u update\u params)
,因为当前的\u密码
不是数据库中的字段(至少不是默认模式),请尝试调用更新\u资源(@user,account\u update\u params)
由您继承的Deviate::RegistrationController提供。这反过来调用resource.update_与_密码(params),该密码由designe的databaseauthenticable
模块提供,并在更新所有传递的其他参数之前检查当前_密码
但是,看起来标准的DevisionController::RegistrationsController.update()将支持您想要的以及更多(例如,如果更新需要确认电子邮件,则进行处理);您需要覆盖它有什么原因吗?对我来说,它的工作原理是:
编辑app/controllers/application_controller.rb
并添加以下代码
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation) }
end
protected
def update_resource(resource, params)
resource.update_without_password(params)
end
编辑/app/controllers/users/registrations\u controller.rb
并添加以下代码
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation) }
end
protected
def update_resource(resource, params)
resource.update_without_password(params)
end
并添加以下路径
devise_for :users, controllers: {registrations: 'registrations'}
然后,在尝试保存更改而不确认密码时,我没有返回任何问题。从Desive 4开始
获取“当前密码”的未知属性时,
无需使用设计参数\u消毒剂
进入app/controllers/registrations\u controller.rb
改变
def update_resource(resource, params)
resource.update_without_password(params)
end
借
今天我对Ruby、Rails和Desive的以下版本也有同样的问题:
- ruby-2.4.0
- 轨道-5.1.4
- 设计-4.3.0
以下是我的解决方案:
在app/controllers/registrations\u controller.rb中创建注册控制器
你到底是从哪里得到错误的?您是否可以共享错误stacktrace.getting行上的错误:@user.update\u atributes(account\u update\u params)。
class RegistrationsController < Devise::RegistrationsController
protected
def update_resource(resource, params)
# Require current password if user is trying to change password.
return super if params["password"]&.present?
# Allows user to update registration information without password.
resource.update_without_password(params.except("current_password"))
end
end
# config/routes.rb
devise_for :users, controllers: { registrations: "registrations" }