2017-12-15 6 views
-2

사용자가 로그인 한 상태에서 비밀번호를 입력하지 않고도 프로필을 업데이트 할 수 있도록 노력하고 있습니다. 그러나 사용자가 로그인되어 있어도 비밀번호를 입력하지 않으면 수정할 수 없습니다.Devise가 편집을 위해 비밀번호가 필요합니다.

는이 오류 얻을 :

1 error prohibited this user from being saved:

Current password can't be blank

<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

에서이 자원을 찾을 수 있습니다 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 
0

이것은 내가 내 모든 프로젝트에서 설정 한 방법이다. 나는 모델에서 할

먼저 내가 암호가 업데이트가 필요하고 방법은 컨트롤러에 이제 새로운 기록을의 경우

#app/models/user.rb 
class User < ApplicationRecord 
    ... 
    attr_accessor :updating_password 

    private 
    def should_validate_password? 
    updating_password || new_record? 
    end 
    ... 
end 

을 볼 경우 attr_accessor 확인하기 위해 만드는, 내가 확인하는 before_filter를 만들 암호를 제출하고 내가 PARAMS에서 제거 비어 있지만 가장 중요한 부분 인 경우

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 

내가이 당신에게

을하는 데 도움이되기를 바랍니다 사용자 모델에 user.updating_password 플래그를 전달하는 경우

해피 해킹