복붙노트

[RUBY-ON-RAILS] 암호가없는 고안 사용자 업데이트

RUBY-ON-RAILS

암호가없는 고안 사용자 업데이트

나는 유증에 암호없이 사용자 속성을 업데이트 할. 이 사건은 암호와 암호 확인 필드를 비워하지 않으면 그때는 오류를 고안 필요,처럼 그들은 다음 비어있는 경우 다른 사용자 속성을 업데이트해야합니다. 어떻게 유증으로이 작업을 수행 할 수 있습니까?

사전에 감사합니다!

해결법

  1. ==============================

    1.이것은 당신은 무엇을 위해있는 거 모습인가? 유증의 위키에서

    이것은 당신은 무엇을 위해있는 거 모습인가? 유증의 위키에서

    사용자가 암호를 제공하지 않고 자신의 계정을 편집 할 수 있도록 허용

    그것은 3 레일, 4 레일을 위해 그것을 수행하는 방법을 보여줍니다

    =======================

    존의 솔루션은 간단한 대안이다

  2. ==============================

    2.나는이 훨씬 더 나은 솔루션 생각 :

    나는이 훨씬 더 나은 솔루션 생각 :

    if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
        params[:user].delete(:password)
        params[:user].delete(:password_confirmation)
    end
    

    이 비어있는 경우 단순히 양식 응답에서 암호 필드를 제거하여 고안 컨트롤러를 변경할 필요에서이 방지를.

    그냥 @ user.attributes = PARAMS하기 전에이를 사용해야합니다 [: 사용자] 또는 당신이 무엇을 양식에서 새로운 매개 변수를 설정하여 업데이트 작업에 사용합니다.

  3. ==============================

    3.나는 당신이 당신의 서브 클래스 컨트롤러 update_resource을 대체 할 수 있습니다 3.2 이상 고안으로 생각합니다. 여기에 원래 묻는 질문에 대한 예입니다 :

    나는 당신이 당신의 서브 클래스 컨트롤러 update_resource을 대체 할 수 있습니다 3.2 이상 고안으로 생각합니다. 여기에 원래 묻는 질문에 대한 예입니다 :

    class MyRegistrationsController < Devise::RegistrationsController
      protected
    
      def update_resource(resource, params)
        resource.update_without_password(params)
      end
    end
    
  4. ==============================

    4.다음과 같이 나는이 문제를 해결 : 양식을 암호로 제출하는 경우, 다음 암호 current_password없이 업데이트 current_password 필드 또는 양식을 작성 필요

    다음과 같이 나는이 문제를 해결 : 양식을 암호로 제출하는 경우, 다음 암호 current_password없이 업데이트 current_password 필드 또는 양식을 작성 필요

    모델 :

    class User
      devise: bla-bla-bla
    
      attr_accessor :current_password
    end
    

    컨트롤러에서 :

    class Users::RegistrationsController <  Devise::RegistrationsController
      layout 'application'
    
    
       def update
        self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    
    
        # custom logic
        if params[:user][:password].present?
          result = resource.update_with_password(params[resource_name])
        else
          result = resource.update_without_password(params[resource_name])
        end
    
        # standart devise behaviour
        if result
          if is_navigational_format?
            if resource.respond_to?(:pending_reconfirmation?) && resource.pending_reconfirmation?
              flash_key = :update_needs_confirmation
            end
            set_flash_message :notice, flash_key || :updated
          end
          sign_in resource_name, resource, :bypass => true
          respond_with resource, :location => after_update_path_for(resource)
        else
          clean_up_passwords resource
          respond_with resource
        end
      end
    end
    
  5. ==============================

    5.내 인터페이스로이 문제를 해결한다. 갈 수있는 방법은 두 가지가 있습니다.

    내 인터페이스로이 문제를 해결한다. 갈 수있는 방법은 두 가지가 있습니다.

    jQuery를이 비트가 비어있는 경우에 양식을 제출하기 전에 필드를 사용하지 않습니다. 그것은 Codepen에 대한 데모를 확인, 특정 마크 업 패턴을 필요로한다.

    $(".password-fields").each(function() {
      var $fields, $form;
      $form = $(this).parents("form");
      $fields = $(this).find("input");
      $form.on("submit", function() {
        $fields.each(function() {
          if ($(this).val() === "") {
            $(this).attr("disabled", "disabled");
          }
        });
      });
    });
    

    사용자들이 암호를 업데이트 할 것을 지시하지 않은 경우 또 다른 옵션은 양식에서 암호 필드를 제거하는 것입니다. 여기 CodePen의 예입니다.

    $(".password-fields").each(function () {
      var $fields, $button, html;
      $fields = $(this);
      $button = $fields.prev(".update-password").find("input");
      html = $fields.html();
    
      $button
        .on("change", function () {
          if ( $(this).is(":checked") ) {
            $fields.html(html);
          }
          else {
            $fields.html("");
          }
        })
        .prop("checked", "checked")
        .click();
    });
    

    두 경우 모두,이 응용 프로그램 자체에 어떤 업데이트가 필요하지 않습니다. 당신은 당신이 변경하려는 필드를 제출한다.

  6. ==============================

    6.내가 대신 #password_required 오버라이드 (override)하는? 사용자 모델 내부 방법.

    내가 대신 #password_required 오버라이드 (override)하는? 사용자 모델 내부 방법.

    class User < ActiveRecord::Base
      devise :database_authenticatable, :validatable #, ...
    
      def password_required?
        if respond_to?(:reset_password_token)
          return true if reset_password_token.present?
        end
        return true if new_record?
        password.present? || password_confirmation.present?
      end
    end
    

    사용자가 새로운 그래서 만약 그가 암호를 지정해야합니다. 그러나 그는 어느 비밀번호 password_confirmation 속성을 채우고 경우에만 사용자가 암호를 지정해야합니다 존재한다.

    자세한 내용은 다음을 참조하십시오 https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L33

    내 구현은 원본과 거의 동일합니다 : https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L53

    (빈 문자열을 false를 반환하는) 내가 존재를 확인하는 것을 제외

    다음은이 문제에 대한 내 풀 요청에 대한 토론입니다 : https://github.com/plataformatec/devise/pull/3920

  7. ==============================

    7.당신은 여전히 ​​지원 암호 변경을 원하지만 그것을 선택하게되면, 같은 current_password의 가용성을 확인 :

    당신은 여전히 ​​지원 암호 변경을 원하지만 그것을 선택하게되면, 같은 current_password의 가용성을 확인 :

    class MyRegistrationsController < Devise::RegistrationsController
      protected
    
      def update_resource(resource, params)
        if params[:current_password].blank?
         resource.update_without_password(params.except(:current_password))
        else
          resource.update_with_password(params)
        end
      end
    end
    

    current_password이 존재하는 그런 식으로하는 경우는 진행과 암호를 업데이트, 다른 암호없이 업데이트를 무시할 수 있습니다.

  8. ==============================

    8.PARAMS [: 사용] : 암호] 레일 (6)에서 작동하지

    PARAMS [: 사용] : 암호] 레일 (6)에서 작동하지

    PARAMS에 [: 사용자] [암호] 당신은 변경 PARAMS에있는 [: 비밀번호]

    제거 [: 사용자] 모든 PARAMS에서

    내 소스 코드는 다음과 같습니다

    실행이 명령 전에

    class Users::RegistrationsController < Devise::RegistrationsController
      # before_action :configure_sign_up_params, only: [:create]
      # before_action :configure_account_update_params, only: [:update]
    
      protected
    
      def update_resource(resource, params)
        puts "params ===> #{params}"
        if params[:password].blank? && params[:password_confirmation].blank?
          params.delete(:password)
          params.delete(:password_confirmation)
          params.delete(:current_password)
          resource.update_without_password(params)
        else
          super
        end
      end
    end
    
  9. ==============================

    9.당신은 사용자가 (수단은 현재 암호를 제공하지 않고 다른 속성을 변경할 수 있습니다) 암호 변경을 시도 할 경우에만 고안은 현재 암호를 확인하려면 :

    당신은 사용자가 (수단은 현재 암호를 제공하지 않고 다른 속성을 변경할 수 있습니다) 암호 변경을 시도 할 경우에만 고안은 현재 암호를 확인하려면 :

    class RegistrationsController < Devise::RegistrationsController
    
      protected
    
        def update_resource(resource, params)
          if params[:password].blank? && params[:password_confirmation].blank?
          resource.update_without_password(params)
        else
         super
        end
      end
    end
    

    또한 모델의 :

    attr_accessor :current_password
    

    그리고 약 잊지 마세요

    devise_for :users, controllers: {registrations: 'registrations'}
    

    routes.rb한다.

  10. ==============================

    10.해결 방법은 사용자 모델에 넣어

    해결 방법은 사용자 모델에 넣어

    def password_required?
      encrypted_password.blank? || encrypted_password_changed?
    end
    
  11. ==============================

    11.내가 컨트롤러에 너무 많은 코드를 생각하지 않을 수 있도록 더 많은 비즈니스 로직입니다. 내가 고안 :: 모델을 대체 제안 :: Validatable #은 password_required? 모델의 :

    내가 컨트롤러에 너무 많은 코드를 생각하지 않을 수 있도록 더 많은 비즈니스 로직입니다. 내가 고안 :: 모델을 대체 제안 :: Validatable #은 password_required? 모델의 :

    def password_required?
      new_record? || password.present? || password_confirmation.present?
    end
    
  12. ==============================

    12.나는 동일한 문제가 내가 생각 해낸이 솔루션을했고 작동 날 믿어. 여기에 무슨 일이 일어나고있는 것은 암호 필요가 다른 업데이트 된 암호를 비워두고 할 때 관리자 암호를 제공 할 것입니다 : 내가 한 일은 살펴 번째 user_params 방법을 만들고 어쨌든 user_params_no_pass 이름입니다. 암호가 비어있는 경우 user_params_no_pass 다른 user_params 사용됩니다. 나는 희망이 도움이

    나는 동일한 문제가 내가 생각 해낸이 솔루션을했고 작동 날 믿어. 여기에 무슨 일이 일어나고있는 것은 암호 필요가 다른 업데이트 된 암호를 비워두고 할 때 관리자 암호를 제공 할 것입니다 : 내가 한 일은 살펴 번째 user_params 방법을 만들고 어쨌든 user_params_no_pass 이름입니다. 암호가 비어있는 경우 user_params_no_pass 다른 user_params 사용됩니다. 나는 희망이 도움이

        def update
    
        if @user.valid_password?(params[:user][:password])
              respond_to do |format|
    
                if @user.update(user_params)
                  format.html { redirect_to @user, notice: 'User profile was successfully updated.' }
                  format.json { render :show, status: :ok, location: @user }
                else
                 format.html { render :new }
                 format.json { render json: @user.errors, status: :unprocessable_entity }
                end
              end
        else
          respond_to do |format|
    
                if @user.update(user_params_no_pass)
                  format.html { redirect_to @user, notice: 'User profile was successfully updated without password.' }
                  format.json { render :show, status: :ok, location: @user }
                else
                  format.html { render :edit }
                  format.json { render json: @user.errors, status: :unprocessable_entity }
                end
              end
        end
      end
    
      def destroy
         @user.destroy
          respond_to do |format|
            format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
            format.json { head :no_content }
          end
      end
      private
    
        def set_user
          @user = User.find(params[:id])
        end
    
        def user_params
          params.require(:user).permit(:user_name, :first_name, :middle_name, :last_name, :dob, :gender, :race, :hispanic, :leader, :mentor, :student, :email, :organization_id, :password, :opus,
      :release_date, :days_to_release, :current_level, :is_active)
        end
    
    
        def user_params_no_pass
          params.require(:user).permit(:user_name, :first_name, :middle_name, :last_name, :dob, :gender, :race, :hispanic, :leader, :mentor, :student, :email, :organization_id, :opus,
      :release_date, :days_to_release, :current_level, :is_active)
        end
    
  13. ==============================

    13.나는 쉽게 따라 위의 코드에서이 약간의 변화를 찾을 수 있습니다 :

    나는 쉽게 따라 위의 코드에서이 약간의 변화를 찾을 수 있습니다 :

    def update
      @user = User.find(params[:id])
    
      method = if user_params[:password].blank?
                 :update_without_password
               else
                 :update_with_password
    
      if @user.send(method, user_params)
        redirect_to @user, notice: 'User settings were saved.'
      else
        render :edit
      end
    end
    
  14. ==============================

    14.위의 가능성의 많은 탐사 후 나는 마지막으로 암호와 몇 가지 않고 일부 속성을 업데이트 할 수있는 해결책을 발견 :

    위의 가능성의 많은 탐사 후 나는 마지막으로 암호와 몇 가지 않고 일부 속성을 업데이트 할 수있는 해결책을 발견 :

    난에 다음 양식 사용자 / edit.html.erb에 대한 전망을했다.

    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>
      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>
    
      <%= f.submit "Save changes"%>
    <% end %>
    

    나는 routes.rb의 경로를 설정

    resources :users, only: [:show, :index, :edit, :update]
    

    나는 users_controller.rb 편집 및 업데이트 방법을 만들어

    def edit
      @user = current_user
    end
    
    def update
      @user = current_user
      if @user.update_attributes(user_params)
        flash[:success] = "Profile updated"
        redirect_to root_url
      else
        render 'edit'
      end
    end
    
    
    def user_params
      params.require(:user).permit(:name, :avatar, :whatsup)
    end
    

    나는 암호가 필요하지 않은 변경이 편집보기를 사용했다. 나는 그것을 링크 때문에 완전히 유증 등록 컨트롤러를 건너 뜁니다

    edit_user_path(current_user)
    

    이메일과 비밀번호가 여기에 변경할 수 없습니다, 그래서 나는 또한 PARAMS을 설정합니다. 업데이트 비밀번호 및 이메일에, 나는 주식 생성 유증보기 링크 :

    edit_user_registration_path(current_user)
    

    나는이 주변에 거대한 작품이다 인정하지만 간단한 해결책으로는 위의 모든 문제를 해결하지 않습니다.

  15. ==============================

    15.더 나은 짧은 방법 다음 user_params 블록에 추가 체크 PARAMS. 예를 들면 :

    더 나은 짧은 방법 다음 user_params 블록에 추가 체크 PARAMS. 예를 들면 :

    def user_params
        up = params.require(:user).permit(
          %i[first_name last_name role_id email encrypted_password
             reset_password_token reset_password_sent_at remember_created_at
             password password_confirmation]
        )
    
        if up[:password].blank? && up[:password_confirmation].blank?
          up.delete(:password)
          up.delete(:password_confirmation)
        end
        up
    end
    
  16. ==============================

    16.업데이트는 사용자 속성에, 당신은 사용해야합니다 : current_password를, '사용자의 사용 올바른 current_password 또는 누군가가 사용자를 중단하고자 할'확인

    업데이트는 사용자 속성에, 당신은 사용해야합니다 : current_password를, '사용자의 사용 올바른 current_password 또는 누군가가 사용자를 중단하고자 할'확인

    형태 그래서 :

    = f.input :current_password,
              hint: "we need your current password to confirm your changes",
              required: true,
              input_html: { autocomplete: "current-password" }
    

    컨트롤러 :

        if your_user.valid_password?(params[:user][:current_password])
            your_user.update_attributes(user_params.except(:current_password, :password, :password_confirmation))
        end
    

    첫 번째 라인 검사 '사용자가 올바른 암호를 보내거나하지 않습니다'하고 우리는 쓰레기없는 속성을 업데이트하기 위해 할 수있는

  17. from https://stackoverflow.com/questions/5113248/devise-update-user-without-password by cc-by-sa and MIT license