Rails User패스워드 변경,탈퇴 기능 만들기

Posted by negabaro kim on Thursday, May 3, 2018 Tags: rails devise   4 minute read

이 포스트에서는 웹서비스에 자주 사용되는 기능중 하나인 유저 패스워드 변경과 회원탈퇴기능을 구현하는 방법을 알아보자.

유저 패스워드 변경하는 기능 만들기

루트설정

scope module: :front do
    namespace :my do
      resource :passwords, only: [:edit, :update]
    end
  end

모델설정

디비에 컬럼을 추가할 필요가 없으므로 rails g model xxx을 사용하지 않고 직접 app/models/change_password.rb 라는 파일을 만들어서 이하와 같은 설정을 넣어준다.

#vim app/models/change_password.rb

class ChangePassword
  include ActiveModel::Model

  attr_accessor :current_password, :new_password, :new_password_confirmation 

  validates :current_password, presence: true
  validates :new_password, presence: true
  validates :new_password_confirmation, presence: true
end

컨트롤러 설정

rails g controller front/my/passwords
# app/controllers/front/my/passwords_controller.rb
def edit
  @change_password = ChangePassword.new
end
  
def update
  @change_password = ChangePassword.new(password_params)
  @change_password.valid?

  unless current_user.valid_password?(@change_password.current_password)
    @change_password.errors.add(:current_password, '가 틀립니다.')
  end

  if @change_password.new_password != @change_password.new_password_confirmation
    @change_password.errors.add(:new_password_confirmation,'새로운 패스워드가 일치하지 않습니다.')
  end

  render action: :edit and return if @change_password.errors.any?
    
  current_user.password = @change_password.new_password
  current_user.save!

  redirect_to action: :edit

end
    
private
  def password_params
    params.require(:change_password).permit(:new_password,:new_password_confirmation,:current_password)
  end

회원탈퇴 기능 만들기

routes설정

scope module: :front do
    namespace :my do
      resource :passwords, only: [:edit, :update]
      resource :resign, only: [:show, :destroy]
    end
  end
 

resign을 추가해줬다.

컨트롤러

rails g controller front/my/resigns
#app/controllers/front/my/resigns_controller.rb
  def edit

  end

  def destroy
    current_user.destroy
    redirect_to root_path, notice: '탈퇴했습니다.'
  end

뷰설정

#app/views/front/my/resigns/edit.html.erb
<div class="main users-edit">
  <div class="container">
    <div class="form-heading">회원탈퇴</div>
    <div class="form users-form">
      <div class="form-body">
        <% current_user.errors.full_messages.each do |message| %>
          <div class="form-error">
            <%= message %>
          </div>
        <% end %>
        <%= link_to "탈퇴", my_resigns_path, method: :delete,data: {confirm: '정말로 탈퇴하시겠습니까?'} %>
       
      </div>
    </div>
  </div>
</div>

rake routes결과

 edit_my_passwords GET    /my/passwords/edit(.:format)              front/my/passwords#edit
              my_passwords PATCH  /my/passwords(.:format)                   front/my/passwords#update
                           PUT    /my/passwords(.:format)                   front/my/passwords#update
           edit_my_resigns GET    /my/resigns/edit(.:format)                front/my/resigns#edit
                my_resigns GET    /my/resigns(.:format)                     front/my/resigns#show
                           DELETE /my/resigns(.:format)                     front/my/resigns#destroy

프로필페이지에서의 링크

      <%= link_to("비밀번호 변경", edit_my_passwords_path) %>
      <%= link_to("탈퇴", edit_my_resigns_path) %>

웹서비스에서 자주 쓰이는 비밀번호 변경과 회원탈퇴 기능을 만들어봤다.