[RUBY-ON-RAILS] 암호가없는 고안 사용자 업데이트
RUBY-ON-RAILS암호가없는 고안 사용자 업데이트
나는 유증에 암호없이 사용자 속성을 업데이트 할. 이 사건은 암호와 암호 확인 필드를 비워하지 않으면 그때는 오류를 고안 필요,처럼 그들은 다음 비어있는 경우 다른 사용자 속성을 업데이트해야합니다. 어떻게 유증으로이 작업을 수행 할 수 있습니까?
사전에 감사합니다!
해결법
-
==============================
1.이것은 당신은 무엇을 위해있는 거 모습인가? 유증의 위키에서
이것은 당신은 무엇을 위해있는 거 모습인가? 유증의 위키에서
사용자가 암호를 제공하지 않고 자신의 계정을 편집 할 수 있도록 허용
그것은 3 레일, 4 레일을 위해 그것을 수행하는 방법을 보여줍니다
=======================
존의 솔루션은 간단한 대안이다
-
==============================
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.나는 당신이 당신의 서브 클래스 컨트롤러 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.다음과 같이 나는이 문제를 해결 : 양식을 암호로 제출하는 경우, 다음 암호 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.내 인터페이스로이 문제를 해결한다. 갈 수있는 방법은 두 가지가 있습니다.
내 인터페이스로이 문제를 해결한다. 갈 수있는 방법은 두 가지가 있습니다.
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.내가 대신 #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.당신은 여전히 지원 암호 변경을 원하지만 그것을 선택하게되면, 같은 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.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.당신은 사용자가 (수단은 현재 암호를 제공하지 않고 다른 속성을 변경할 수 있습니다) 암호 변경을 시도 할 경우에만 고안은 현재 암호를 확인하려면 :
당신은 사용자가 (수단은 현재 암호를 제공하지 않고 다른 속성을 변경할 수 있습니다) 암호 변경을 시도 할 경우에만 고안은 현재 암호를 확인하려면 :
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.해결 방법은 사용자 모델에 넣어
해결 방법은 사용자 모델에 넣어
def password_required? encrypted_password.blank? || encrypted_password_changed? end
-
==============================
11.내가 컨트롤러에 너무 많은 코드를 생각하지 않을 수 있도록 더 많은 비즈니스 로직입니다. 내가 고안 :: 모델을 대체 제안 :: Validatable #은 password_required? 모델의 :
내가 컨트롤러에 너무 많은 코드를 생각하지 않을 수 있도록 더 많은 비즈니스 로직입니다. 내가 고안 :: 모델을 대체 제안 :: Validatable #은 password_required? 모델의 :
def password_required? new_record? || password.present? || password_confirmation.present? end
-
==============================
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.나는 쉽게 따라 위의 코드에서이 약간의 변화를 찾을 수 있습니다 :
나는 쉽게 따라 위의 코드에서이 약간의 변화를 찾을 수 있습니다 :
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.위의 가능성의 많은 탐사 후 나는 마지막으로 암호와 몇 가지 않고 일부 속성을 업데이트 할 수있는 해결책을 발견 :
위의 가능성의 많은 탐사 후 나는 마지막으로 암호와 몇 가지 않고 일부 속성을 업데이트 할 수있는 해결책을 발견 :
난에 다음 양식 사용자 / 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.더 나은 짧은 방법 다음 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.업데이트는 사용자 속성에, 당신은 사용해야합니다 : 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
첫 번째 라인 검사 '사용자가 올바른 암호를 보내거나하지 않습니다'하고 우리는 쓰레기없는 속성을 업데이트하기 위해 할 수있는
from https://stackoverflow.com/questions/5113248/devise-update-user-without-password by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] '존재'와 액티브 레코드 쿼리 협회 레일 (0) | 2020.02.09 |
---|---|
[RUBY-ON-RAILS] 레일에서 파일 다운로드 링크 (0) | 2020.02.09 |
[RUBY-ON-RAILS] 3 유증 레일, CURRENT_USER는 모델에 액세스 할 수 없습니다? (0) | 2020.02.09 |
[RUBY-ON-RAILS] 레일 default_scope 재정의 (0) | 2020.02.09 |
[RUBY-ON-RAILS] 레일 : 유효성 검사 링크 (URL을)에 좋은 방법 무엇입니까? (0) | 2020.02.09 |