[루비온레일즈] 유저-게시물(로그인, 비로그인 검증해 게시글 작성하기)
이전 포스팅에서 devise gem을 사용해서 회원가입, 로그인, 로그아웃 기능을 만들었습니다.
그런데, 현재 만들어놓은 프로젝트에서는 로그인을 해도 로그인을 하지 않아도 게시물을 읽고, 쓰고, 수정하고 삭제할 수 있습니다.
그래서 로그인을 해야만 게시물을 작성할 수 있도록 만들겠습니다.
방법은 3가지 정도로 하겠습니다.
1. 비로그인 시 뷰에서 New Board 버튼 누르면 로그인 페이지로 보내기
2. 컨트롤러의 create액션에서 로그인 여부 검증하기
3. user_id가 없다면 데이터베이스에 저장되기 직전에서 차단하기(validation)
비로그인 시 뷰에서 버튼 - 로그인 페이지로 연결
저는 로그인 하지 않은 상태에서 New Board 버튼을 누르면 로그인 페이지가 나오도록 설정하겠습니다.
글을 작성할 수 있는 페이지인 index.html.erb에서 if...else...end 와 user_signed_in? 을 활용해 로그인했으면 new 로 보내고, 로그인 안했으면 로그인 창으로 보내버립니다.
create 액션 수정하기
로그인을 해야만 게시물을 작성할 수 있도록 하려면 board 컨트롤러의 액션을 수정해야 합니다.
이전에 devise gem을 이용해 유저를 만들었는데, devise는 user_signed_in? 를 통해 로그인 상태를 검증할 수 있습니다. 따라서 if...else...end 구문을 사용해 로그인 상태를 검증해줍니다.
if user_signed_in?
..
else
redirect_to action: '/users/sign_in'
end
...
추가한 코드는 만약 유저가 로그인 하면 새로 작성한 내용을 저장하고 그게 아니라면 /users/sign_in 즉, 로그인 페이지로 보내라는 의미입니다.
이렇게 하고 서버를 실행해 제대로 작동하는지 확인해보겠습니다. 이렇게 비로그인 시에는 게시물이 작성되지 않고 로그인 페이지로 넘어갑니다.
Vaildation 으로 DB저장 직전에서 차단하기
세 가지 방법 중에서 가장 확실한 방법은 비로그인 상태로 게시글을 작성하면 DB에 저장되지 않게 만드는 것입니다. 즉, 게시물 테이블에 user_id 가 누락되면 저장이 안되는 것입니다.
이러한 방법을 Validation이라고 부르며 board.rb에서 validation_presence_of : user_id 라고 입력하면 유저가 누락되었을 때(=비로그인 상태에서) 게시글이 DB에 저장되지 않습니다.
로그인, 비로그인을 검증해 게시물을 작성하는 기능을 구현해보았습니다.
현재는 게시물 작성자가 아니더라도 해당 게시물을 수정하거나 삭제할 수 있는데요,
다음 포스팅에서는 작성자만 게시글을 수정하거나 삭제할 수 있도록 하겠습니다!