我在轨道4.2.1和设计3.4.1。我基本上同时想要两件事:
Allow users to edit their password
和
Allow users to edit their account without providing a password
我设法让他们分开工作。但是第一个问题的解决方案1 似乎是,我担心,与第二个问题的唯一官方解决方案不兼容,因为对于后者,我需要覆盖注册控制器。
因此我尝试在注册控制器而不是应用程序中执行 solution 1 作业:
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :configure_account_update_params, only: [:update]
protected
def configure_account_update_params
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:name, :password, :password_confirmation, :current_password) }
end
def update_resource(resource, params)
resource.update_without_password(params)
end
end
这样,只有添加了 name 等属性才会在密码被完全过滤后更新。 我不确定我是否应该像解决方案2和3 那样开始大量定制,以实现这样一个简单的目标。我错过了什么吗?
答案 0 :(得分:9)
将此添加到您的registrations_controller:
def update_resource(resource, params)
resource.update_without_password(params)
end
覆盖用户模型或使用Devise的模型的update_withour_password方法:
def update_without_password(params, *options)
if params[:password].blank?
params.delete(:password)
params.delete(:password_confirmation) if params[:password_confirmation].blank?
end
result = update_attributes(params, *options)
clean_up_passwords
result
end
答案 1 :(得分:3)
在深入研究设计代码后,我发现update_without_password有意删除:password
和:password_confirmation
参数。出于安全原因,默认情况下会这样做。
所以(可能有风险的)解决方案是在我的资源模型中覆盖 update_without_password ,但不删除密码* params