티스토리 뷰
Ruby on Rails : Devise 문제 이슈 및 해결방안 (게시글을 쓰고 회원탈퇴를 한다면..?)
나른한 하루 2019. 11. 4. 17:07해당 글은 https://blog.naver.com/kbs4674/221056235775 로 부터 게시글이 이전되었습니다.
로그인을 한 상태로 어떤 회원이 게시글을 쓰고, 회원탈퇴를 해버린다면 어떤일이 발생할까요?
어떤 회원이 게시글을 쓰고 회원탈퇴를 하면 아무래도 해당 계정이 delete 되는것이다 보니, 계정 정보가 있는 user DB에서 참고하는 해당 계정의 method(해당 계정의 정보 : email, 닉네임 등등..)를 찾지 못해서 방황하는 상황이 발생하게 됩니다.
이런 문제.. 어떻게 해결해야 할까요?
- devise 문제 이슈 해결
" 그럼 게시판의 정보가 담긴 post 테이블에서 글 작성자의 닉네임값 등을 받아오면 되지 않을까요!? "
네 우선 그것은 하나의 해결책입니다! (이번 글에서 이 방법에 대해 설명하고자 합니다.)
하지만 이 방법에 있어 하나의 문제점(이슈)가 있긴 한데 나중에 다루겠습니다.
1. 자신의 게시판 DB가 담긴 파일로 가서, 새로운 컬럼을 추가시킵니다.
참고 필자의 경우, 게시판 테이블 정보는 db/migrate/[기간]_create_posts.rb 에 담겨져 있습니다.
변경 전 (db/migrate/[기간]_create_posts.rb)
class CreatePosts < ActiveRecord::Migration[5.2]
def change
create_table :posts do |t|
t.string :title, comment: "제목"
t.text :content, comment: "내용"
t.integer :user_id
t.timestamps
end
end
end
변경 후 (db/migrate/[기간]_create_post.rb)
class CreatePosts < ActiveRecord::Migration[5.2]
def change
create_table :posts do |t|
t.string :title, comment: "제목"
t.text :content, comment: "내용"
t.integer :user_id
t.string :user_email
t.timestamps
end
end
end
2. 터미널에서 다음 명령어를 순서대로 입력합니다.
rake db:drop
rake db:migrate
4. app/controllers/posts.controller.rb 로 이동한 후, 게시글이 써지는 def create 액션에 다음 코드를 추가 입력해줍니다.
* @post = Post.new(post_params) 밑에 써야합니다.
class PostsController < ApplicationController
...
def create
@post = Post.new(post_params)
@post.user_email = current_user.email
...
end
end
5. (선택사항) 여기서 잠시! 게시글을 아무거나 하나 써볼까요?
게시글을 하나 작성을 하고, Rails DB Gem을 통해 테이블 데이터를 확인해보면..
게시판 DB에 글 작성자의 정보(Email)가 같이 기록된게 확인됩니다!
6. User에서 참고하는 정보(email 등)를 보는 View 영역으로 가시고, 코드를 바꿔야 하는데요.
저같은 경우는 목록(index)과 게시글(show) 이 2가지에서 바꿔보도록 하겠습니다.
app/views/posts/index.html.erb
<% @posts.each do |post| %>
<table border="0" width="100%">
<tr bgcolor="white" onMouseOver="this.style.backgroundColor='#ECECEC'" onMouseOut="this.style.backgroundColor='#FFFFFF'">
...
<td width="15%" align="left" style="border-bottom: 1px dashed gray;"><div class="board_nickname_etc" style="margin-left: 15px;"><i class="fa fa-user-o" aria-hidden="true"></i> <%= post.user.email %></div></td>
...
</tr>
</table>
<% end %>
1) 저희는 여기서 <tr> 태그 사이에 있는 <td> 태그 내 코드를 바꿔야 합니다.
우선, 코드가 수정된 내용을 보여드리면 아래 코드와 같습니다.
<td width="15%" align="left" style="border-bottom: 1px dashed gray;"><div class="board_nickname_etc" style="margin-left: 15px;"><i class="fa fa-user-o" aria-hidden="true"></i> <%= post.user != nil ? post.user.email : post.user_email %></div></td>
간단히 해설을 하자면.. 삼항 연산자를 이용한 것으로, @posts.user이 nil이 아닌지(!=) 체크를 하고,
- nil이 아닌 경우(True) @post.user.email을 보여주고 (users 테이블에서 참고해서 정보를 가져옴)
- nil인 경우(False) @post.user_email을 보여줍니다.
참고 @post.user가 nil인 경우는?
=> 회원 탈퇴를 해서 유저 정보가 지워졌을 때!
- 회원 탈퇴 시 유저가 작성했던 모든 게시글을 지우기
참고
해당 방법은 삭제를 하고자 하는 데이터가 소속된 테이블 별로 user_id가 기록 되어있어야 합니다.
해당 부분이 이해가 안가는 부분은 Devise와 연계되는 Scaffold 게시판 제작[클릭] 글을 참고 해주세요.
회원탈퇴 시 유저가 작성했던 모든 게시글에 대해 삭제를 해야하는 일이 생길 수 있습니다.
해당 부분에 대한 방법은 간단하게 할 수 있습니다.
1. User 모델로 이동합니다 : app/models/user.rb
2. 회원 탈퇴와 동시에 데이터가 삭제하고자 하는 대상의 has_many relation 관계를 나타내는 코드를 추가합니다.
has_many :posts, dependent: :destroy
저는 회원이 탈퇴 시 Post 모델에 등록된 게시글이 전부 삭제되도록 했습니다.
3. 회원탈퇴 후, DB를 한번 확인해보세요!
삭제가 잘 될겁니다.
- 도움 및 자료 참고
1. 우리 팀원 : L.G.S 형, K.S.H 형
2. 멋쟁이 사자 회원분들 및 댓글 제보
3. 관계모델 dependent 설정 [클릭]
루비온 레일즈 Ruby on Rails ROR
'프로그래밍 공부 > Ruby on Rails : Gem' 카테고리의 다른 글
Ruby on Rails : devise를 활용한 이메일 인증 [Gem : devise] (0) | 2019.11.04 |
---|---|
Ruby on Rails : Devise에 닉네임, 오늘의 한마디 기능 넣기 (0) | 2019.11.04 |
Ruby on Rails : devise 한글번역 + 'Time-Ago 번역' [Gem : devise-i18n] (0) | 2019.11.03 |
Ruby on Rails : 로그인/회원가입 [Gem : devise] (0) | 2019.11.03 |
Ruby on Rails : 코드/계정 보안을 위한 Gem [Gem : Figaro] (0) | 2019.11.03 |