티스토리 뷰

프로그래밍 공부/Ruby on Rails : 이론

Ruby on Rails : 댓글 구현 (1:M 개념 익히기)

마음 따뜻한 개발자, 나른한 하루 2019. 11. 3. 14:57

Post 모델에 종속된 댓글 구현을 한번 해보겠습니다.

 참고  게시판이 될 Post 모델은 간단히 Scaffold로 구현으로 진행됩니다.

 

 

  • 1 : M을 활용한 댓글 구현

1. 게시판이 될 Post Scaffold를 생성합니다.

rails g scaffold post title content:text

 참고  Scaffold 개념 [클릭]

 

2. 터미널에서 다음 명령어를 입력해서 Comment Model 및 Controller을 형성합니다.

rails g model comment post_id:integer body:text

 참고  post_id는 외래테이블(Post) 참고용으로 쓰일 예정입니다.

 

 

rails g controller comments create destroy

 참고 

create : 새로 작성된 댓글 관련 데이터를 DB에 등록

destroy : 특정 댓글 데이터 제거

 

3. Post 및 Comment 모델을 생성했으니, 다음 명령어를 입력해서 DB를 업데이트 합니다.

rake db:migrate

 

4. Post Model에 데이터 관계를 정의합니다.

##app/models/post.rb

class Post < ApplicationRecord
    has_many :comments, dependent: :destroy
end

 참고1  dependent

dependent : Post와 has_many로 관계정의가 된 comments 테이블 관계에 있어 Post 데이터가 삭제 시, 그와 관련된 댓글들 또한 자동적으로 삭제가 이루어집니다.

 참고2  has_many 대상의 이름은 '복수명' 으로 표기해야 합니다.

 

5.  config/routes.rb  에서 URI 관계를 재 정의합니다.

1) 다음 정의들을 지워주세요.

## config/routes.rb

get 'comments/create'
get 'comments/destroy’
resources :posts

 

2) 이어서 다음과 같이 작성해주세요.

## config/routes.rb

resources :posts
resources :posts do
    resources :comments
end

 

3) URI 정의 후, 라우트 맵핑결과를 한번 확인해 보세요!

posts do로 감싸진 부분이 /post/:post_id/comments 와 같은 형식으로 자동으로 URI 규칙이 정의됩니다.

 

6. Post Scaffold의  show.html.erb  에서 게시글 내용이 보여지는 아랫부분 다음 내용을 추가합니다.

## app/views/posts/show.html.erb

... (내용 생략) ...

<div>
    <h2>댓글</h2>
        <%= form_tag("/posts/#{@post.id}/comments", method: "post") do %>
            <%= text_field_tag(:co_body, nil) %>
            <%= submit_tag("댓글 작성") %>
    <% end %>
</div>

<div>
    <h2>댓글 목록</h2>
    <% @post.comments.each do |x| %>
        <%= x.body %>
        <%= link_to "글 삭제", "/posts/#{@post.id}/comments/#{x.id}", method: "delete" %>
        <hr/>
    <% end %>
</div>

<%= link_to 'Edit', edit_post_path(@post) %> | 

 

7. Comment Controller에 다음 내용을 작성합니다.

## app/controllers/comments_controller.rb

class CommentsController < ApplicationController
    def create
        Comment.create(post_id: params[:post_id], body: params[:co_body])
        redirect_to request.referrer
    end

    def destroy
        @post = Post.find(params[:post_id])
        @comment = @post.comments
        @comment.find(params[:id]).destroy
        redirect_to request.referrer
    end
end

Post 게시글에서 댓글 작성 시 Comment의 create 액션으로 데이터가 넘어갔을 때 확인할 수 있는 데이터 기록

 참고  request.referrer

이 전 페이지에 대한 기록을 가지고 있는 변수입니다.

 

8. 이제 댓글 기능이 완성되었습니다! 직접 댓글을 등록해보고, 삭제해보세요!

 

9. 데이터 기록도 한번 살펴보면 다음과 같이 보입니다!

 

루비온 레일즈 Ruby on Rails ROR

댓글
댓글쓰기 폼
공지사항
Total
148,752
Today
0
Yesterday
118
링크
«   2021/10   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
글 보관함