有许多问题(例如:here和here)解决了这个问题(并且对于遇到同样问题的其他人有用),但它们都没有为我工作。
使用Rails 5.0.0和Devise 4.2,最终我尝试允许管理员编辑其他用户,并允许普通用户编辑自己的帐户。 This需要a few modifications,因为默认情况下,Devise不允许登录用户编辑其他用户。
users/:id/edit
视图中的表单现在填充正确的用户,但更新失败,日志中包含Unpermitted parameter: current_password
。我相信我需要将:current_password
列入白名单,但这些建议都没有为我做到这一点。
的routes.rb
devise_for :users, controllers: {registrations: 'registrations'}, path_prefix: 'my'
resources :users
(path_prefix
" my"被建议作为避免Devise和:users
资源之间路由冲突的方法。)
registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
before_action :configure_permitted_parameters, if: :devise_controller?
...
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) do |u|
u.permit(:password, :password_confirmation)
end
devise_parameter_sanitizer.for(:account_update) do |u|
u.permit(:password, :password_confirmation, :current_password)
end
end
end
users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:edit, :show, :update, :destroy]
...
def edit
end
def update
@user = User.find(params[:id])
if @user.update(user_params)
redirect_to cohorts_path
else
render 'edit'
end
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :roles, :nickname, :location, :headshot, :goals)
end
end
您可能想知道为什么我没有将:current_password
添加到user_params
。这样做会产生unknown attribute 'current_password' for User. error.(添加建议的attr_accessor
没有帮助。)
这是我第一次需要自定义Devise。任何帮助表示赞赏!
答案 0 :(得分:0)
在UsersController中添加它 - &gt;&gt;&gt; user_params function - &gt;&gt;&gt;在许可证中,我认为你应该在许可证中添加......
def user_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :roles, :nickname, :location, :headshot, :goals, :current_password) <<<< THERE
end
答案 1 :(得分:0)
终于解决了这个问题。我将the following添加到了UsersController的更新操作中:
if params[:user][:password].blank? && params[:user[:password_confirmation].blank?
params[:user].delete(:password)
params[:user].delete(:password_confirmation)
end
由于它以静默方式失败,the following也有助于诊断更新操作:
Rails.logger.info(@your_object.errors.inspect)
谢谢大家!很高兴有这个解决。