티스토리 뷰
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
참고 request.referrer
이 전 페이지에 대한 기록을 가지고 있는 변수입니다.
8. 이제 댓글 기능이 완성되었습니다! 직접 댓글을 등록해보고, 삭제해보세요!
9. 데이터 기록도 한번 살펴보면 다음과 같이 보입니다!
루비온 레일즈 Ruby on Rails ROR
'프로그래밍 공부 > Ruby on Rails : 이론' 카테고리의 다른 글
Ruby on Rails : 여러가지 메소드 (일부는 깊게 파보기) (0) | 2019.11.06 |
---|---|
Ruby on Rails : 비동기(Ajax) 이벤트 구현 (4) | 2019.11.03 |
Ruby on Rails : 코드의 분산 - render의 개념! (0) | 2019.11.02 |
Ruby on Rails : Active Storage (5) | 2019.11.01 |
Ruby on Rails : turbolink는 jQuery를 싫어한다. (0) | 2019.11.01 |