我试图让用户在不输入密码的情况下更新他们的个人资料,只要他们已经登录。但是,即使用户已登录,我也无法在没有输入密码的情况下进行编辑。
我收到此错误:
1错误禁止此用户被保存:
当前密码不能为空
<h1>User profile home</h1>
<p><%= @user.inspect %></p>
<p><%= @user.first_name %></p>
<p><%= @user.last_name %></p>
<p><%= @user.bio %></p>
<h3>Edit profile</h3>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= devise_error_messages! %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :bio %><br />
<%= f.text_area :bio %>
</div>
<div class="field">
<%= f.label :first_name %><br />
<%= f.text_field :first_name %>
</div>
<div class="field">
<%= f.label :last_name %><br />
<%= f.text_field :last_name %>
</div>
<div class="actions">
<%= f.submit "Update" %>
</div>
<% end %>
更新了控制器
class ProfilesController < Devise::RegistrationsController
include AuthenticationConcern
def home
user_id = params[:id]
check_user_route_access current_user, user_id
@user = User.find_by id: user_id
end
def update
super
end
protected
def update_resource(resource, params)
resource.update_without_password(params)
end
end
答案 0 :(得分:0)
在这里找到Devise 4.1 +
的最佳答案class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :email])
devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :phone, :email, bank_attributes: [:bank_name, :bank_account]])
end
end
答案 1 :(得分:0)
这就是我在所有项目中设置的方式。
我做的第一件事在模型中,我创建了一个attr_accessor
来检查密码是否需要更新,以及一种查看是否有新记录的方法
#app/models/user.rb
class User < ApplicationRecord
...
attr_accessor :updating_password
private
def should_validate_password?
updating_password || new_record?
end
...
end
现在在控制器上,我创建一个before_filter
来检查提交的密码是否为空,我将它从params中删除但最重要的部分是将user.updating_password标志传递给用户模型< / p>
class UsersController < ApplicationController
...
before_filter :check_password_submitted, :only => :update
private
def check_password_submitted
if params[:user][:password].blank?
params[:user].delete("password")
params[:user].delete("password_confirmation")
user.updating_password = false
else
user.updating_password = true
end
end
...
end
我希望这可以帮助你
快乐黑客
答案 2 :(得分:-1)