设计需要密码才能进行编辑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计需要密码才能进行编辑相关的知识,希望对你有一定的参考价值。

我试图让用户更新他们的个人资料而不输入他们的密码,只要他们已经登录。但是,即使用户已登录,我也无法在没有输入密码的情况下进行编辑。

我收到此错误:

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
答案

在Devise 4.1+中找到了最佳答案

devise 4.1+ answer

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
另一答案

这就是我在所有项目中设置的方法。

我做的第一件事在模型中我创建了一个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标志传递给用户模型

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

我希望这对你有所帮助

快乐的黑客

另一答案

快速搜索,你可以在设计维基:) https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password找到这个资源

以上是关于设计需要密码才能进行编辑的主要内容,如果未能解决你的问题,请参考以下文章

按用户角色设计注册编辑?

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

python使用上下文对代码片段进行计时,非装饰器

教程4 - 验证和权限

需要当前密码才能设置新密码

表格加密怎么加密