【问题标题】:Devise requires password for edits设计需要密码才能进行编辑
【发布时间】:2017-12-15 12:52:36
【问题描述】:

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

我收到此错误:

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

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    在这里找到 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
    

    【讨论】:

      【解决方案2】:

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

      我做的第一件事是在模型中创建一个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 来检查密码是否已提交,如果密码为空,我将其从参数中删除,但最重要的部分是将 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
      

      希望对你有帮助

      快乐的黑客

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 所以我按照指南进行操作,但仍然没有运气。我还在做错什么吗? :(
        猜你喜欢
        • 2015-07-23
        • 2013-03-26
        • 2016-05-04
        • 2011-08-29
        • 1970-01-01
        • 2012-11-07
        • 2013-01-04
        • 1970-01-01
        相关资源
        最近更新 更多