이 포스트에서는 웹서비스에 자주 사용되는 기능중 하나인 유저 패스워드 변경과 회원탈퇴기능을 구현하는 방법을 알아보자.
유저 패스워드 변경하는 기능 만들기
루트설정
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) %>
웹서비스에서 자주 쓰이는 비밀번호 변경과 회원탈퇴 기능을 만들어봤다.