devise 문제 이슈 및 해결방안 (게시글을 쓰고 회원탈퇴를 한다면..?)

devise problem issue : if write the board, and member leave (not sign out)

1) 이번 포스팅은 rails_db를 같이 봐가면서 보시면 더욱 이해하기 쉽습니다. [참고 : 클릭 ]

2) 시작 전, 저는 게시판을 scaffold 방식을 사용해서 제작했습니다.

로그인을 한 상태로 어떤 회원이 게시글을 쓰고, 회원탈퇴를 해버린다면 어떤일이 발생할까요?

어떤 회원이 게시글을 쓰고 회원탈퇴를 하면 아무래도 해당 계정이 delete 되는것이다 보니, 계정 정보가 있는 user DB에서 참고하는 해당 계정의 method(해당 계정의 정보 : email, 닉네임 등등..)를 찾지 못해서 방황하는 상황이 발생하게 됩니다.

오류메세지를 자세히 보면 User에서 참고한 정보 중, email이 nill이라는 상태가 확인됩니다.

여기서 nill은 'Null', 즉 '아무 내용도 없다' 라는 것을 의미함.

이런 문제.. 어떻게 해결해야 할까요?


evise 문제 이슈 해결

" 그럼 게시판의 정보가 담긴post DB에 글 작성자의 닉네임값 등을 받아오면 되지 않을까요!? "

네 우선 그것은 하나의 해결책입니다! (이번 글에서 이 방법에 대해 설명하고자 합니다.)

하지만 이 방법에 있어 하나의 문제점(이슈)가 있긴 한데 나중에 다루겠습니다.

  • 자신의 게시판 DB가 담긴 파일로 가서, 새로운 컬럼을 추가시킵니다.

필자의 경우, 게시판 DB는 /db/migrate/Create_Post.rb에 담겨져 있습니다.

1) 변경 전 (/db/migrate/Create_Post.rb)

class CreatePosts < ActiveRecord::Migration[5.1]
  def change
    create_table :posts do |t|
      t.string :title, comment: "제목"
      t.text :content, comment: "내용"

      t.integer :user_id

      t.timestamps
    end
  end
end

2) 변경 후 (/db/migrate/Create_Post.rb)

class CreatePosts < ActiveRecord::Migration[5.1]
  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
  • 명령어 입력창(터미널)에 다음 명령어를 순서대로 입력합니다.
rake db:drop
rake db:migrate

(선택사항) Rails DB Gem이 깔리신 분은 http://.../rails/db 로 이동하셔서 Post Table을 보시면 새로운 컬럼이 추가된걸 확인하실 수 있습니다!

  • /app/controllers/posts.controller.rb 로 이동하시고, 게시글이 써지는 def create 영역에 다음 코드를 추가 입력해줍니다.
class PostsController < ApplicationController
    ...
    def create
        @post = Post.new(post_params)
        @post.user_email = current_user.email # 추가된 코드
        ...
    end
end

작성자 기준으로 작성됨, 작성자는 게시판 관련 Controller 이름이 Post임.

@post = Post.new(post_params) 밑에 써야합니다.

(선택사항)여기서 잠시! 게시글을 아무거나하나 써볼까요?

게시글을 하나 작성을 하고, Rails DB Gem을 통해 확인을 하면..게시판 DB에 글 작성자의 정보(Email)가 같이 기록된게 확인됩니다!

  • User에서 참고하는 정보(email 등)를 보는 View 영역으로 가시고, 코드를 바꿔야 하는데요.

    저같은 경우는 목록(index)과 게시글(show) 이 2가지에서 바꿔보도록 하겠습니다.

1) /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 %>

좀 더럽지만 제 코드가 이러합니다 -.-..

저희는 대략 위 코드에서 유저의 email이 보여지는 부분(t.string :user_email)을 수정할 겁니다.

우선, 저 맨 처음 과정에서 추가된 코드(t.string :user_email) 에 대해 수정된 내용을 보여드리면 아래 코드와 같습니다.

<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을 보여주고 (user DB에서 참고해서 가져옴)

nil인 경우(False) @post.user_email을 보여줍니다. (저희가 Post Table에 추가했던 컬럼에서 가져옴, 즉 Post Table의 User_email 컬럼에 기록된 정보를 가져옴.)

*C언어 공부하셨던 분은 이 문법 아시겠죠??

2) /app/views/posts/show.html.erb

index.html.erb때와 방법이 똑같습니다.

Controller 이름에 맞게 @변수 명만 잘 확인하시고, index.html.erb 때와 동일하게 바꿔주시면 됩니다.

참고

이런 질문이 생길 수도 있습니다.

" View에서 <%= post.user != nil ? post.user.email : post.user_email %> 말고, 바로 <%= post.user_email %> 로 하면 안돼요? "

일단 됩니다, 그리고 저도 처음에 이런방법을 했었습니다. 그런데 문득 한가지 궁금증이 생겼습니다.

" Q. 만약 해당 게시글 작성 회원이 중간에 이메일 주소를 바꿔버리면?... "

일단, Post.rb DB 내에 있는 user_email은, 게시글을 작성(new)할 때만 기록이 되지, devise를 통해 회원정보가 수정된 것에 대해선 반영이 되지 않습니다.

그러니까, 제가 처음에 [email protected] 으로 게시글을 작성하고, [email protected]으로 변경을 하면 글이 작성된 게시판에서는 [email protected]으로 변경된 사실을 모른 채, 계속 글 작성자가 [email protected]으로 보여지게 됩니다.

여기서,한가지 이슈가 있습니다.

View에서<%= post.user != nil ? post.user.email : post.user_email %>이 적용된 상태에서, 게시글 작성 후, email 정보를 바꾸고 회원탈퇴를 하면 PostsDB에 남던 정보가 불러지기 때문에 과거의 닉네임 정보로 불러지게 됩니다.

이 부분은 개인적으로 해결해야 할 하나의 이슈 같습니다..

차선책

위 이슈에 대한 해결방법은 아니지만, 차선책에 대해 많은분들이 답변을 주셨습니다.

회원이 삭제를 하면, 회원이 작성했던 모든 게시글을 자동적으로 삭제하는 방법입니다.

그 방법에 대해선 제가 아직 실험을 안해봤지만, 참고하실분은 다음 아래 사이트로 이동 바랍니다!

:: /app/models/user.rb에서 관계모델(dependent) 지정하기 :클릭

도움 및 참고

  1. 우리 팀원 : L.G.S 형, K.S.H 형

  2. 멋쟁이 사자 회원분들 및 댓글 제보

  3. 관계모델 dependent 설정 [클릭]

results matching ""

    No results matching ""