TIL

# 211117 TIL ([Ruby, slim] job 생성하기, 컨트롤러에 액션 정의하기)

inthess 2021. 11. 18. 10:56

장기현장실습

PLSnote 이슈

#2644 그룹에 탈퇴신청을 하고 일정기간이 지나면 탈퇴가 되는 기능 이슈 진행중 

  • UI 추가 
    • 사용자 기준: 탈퇴신청 UI 추가 (group_apply.html.slim) 현재는 어떤 기준 없이 버튼이 나타나지만 추후 해당 그룹을 30일 동안 사용하지 않은 경우에 탈퇴하기 버튼이 나오도록 수정할 예정
      .col-auto
        .btn.btn-outline-danger 
         	i.fa.fa-minus-circle 
      	' #{t('.withdrawal')}
    • 그룹관리자 기준: 장기미사용 UI 추가 / 탈퇴신청일 UI 추가 (_user.html.slim) 장기 미사용 태그는 그룹에 30일 이상 접근하지 않은 사용자에게만 나타나도록 수정할 예정이고, 탈퇴신청일 태그 또한 탈퇴 신청을  사용자만 나타나고 사용자가 탈퇴 신청 버튼을 클릭한 날짜를 가져와 보여주도록 수정해야함
      .row 
        .col 
      	.badge.badge-warning.mt-1 
      	  = t('group_manager.users.index.long_term_unused') 
        .col-auto 
      	.badge.badge-light.mt-3 
      	  = t('group_manager.users.index.withdrawal_date')
  • 기능 추가
    • 사용자가 탈퇴버튼을 클릭 하고, 그룹 관리자가 따로 제거해주지 않을 경우 60일 뒤 자동 삭제되는 기능 구현중
      • 사용자가 버튼을 클릭했을 때, link_to 뒤에 작성한 url로 이동한다. 이때 작성한 url이란 path를 의미하는데 여기서는 withdraw_user_group_path를 적어주었다. groups_controller.rb에 정의한 withdraw가 실행되도록 한다고 보면 된다. 여기서 현재 유저의 하나의 그룹에 대한 탈퇴 신청이기 때문에 current_user.id와 group.id를 필요로 한다.
        # 탈퇴 버튼 코드(group_apply.html.slim) 
        
        .col-auto 
          = link_to withdraw_user_group_path(current_user.id, group.id, {group_id: group.id}), method: :post, class: 'btn btn-outline-danger' 
        	i.fa.fa-minus-circle 
        	' #{t('.withdrawal')}
        # 버튼 클릭 시, 실행될 액션(?) (groups_controller.rb)
        
        def withdraw 
        	job = DeleteGroupUserJob.set(wait: 60.day).perform_later(params[:group_id] , current_user.id) 
        end
      • 이렇게 컨트롤러에 새로운 액션을 정의했으면 routes.rb에 선언?해주어야 이를 다른 곳에서 불러서 사용할  있다. (잊지말자!!!)
        resources :groups do 
          member do 
            post :apply 
            delete :cancel_apply 
            post :withdraw 
            post :cancel_withdraw
      • 버튼 클릭하면 잡이 생성되고  잡은 60일 뒤에 실행되도록 하였다. 그럼 잡이  일을 정의해야하는데 이건 jobs 폴더에 새로운 파일 delete_group_user_job.rb를 생성했다. Group_user 라는 테이블에서 탈퇴버튼 클릭한 사용자, 그룹의 user_id, group_id 일치하는 것을 삭제하도록 코드를 작성했다.
        class DeleteGroupUserJob < ApplicationJob
          queue_as :default
        
          def perform(group_id, user_id)
            user = GroupUser.where(group_id: group_id, user_id: user_id)
            user.destroy
          end
        end
      • 버튼을 클릭해서 잡이 생성되는지까지 확인한 상태이고, 만약 60일 이전에 그룹관리자가 탈퇴처리를 해버리면 기존에 생성된 잡을 없애는 기능을 추가해야하는 상태이다.