본문 바로가기

Archived(Programming)/Ruby on Rails(기초)

RubyOnRails 2) Model 관계 설정

RubyOnRails 2) Model 관계 설정


Model 간의 관계를 설정해서 Post와 Reply로 활용할 수 있다.

글이 있으면 해당 글이 지니는 댓글을 모델로 지니고 있을 수 있는데 이러한 관계를 통해

여러 가지 것들을 구현할 수 있는데, 대표적으로 글, 댓글을 예시로 들 수 있다.


먼저 다음의 명령어를 통해 Post에 소속될 Reply 모델을 만든다.


1
$ rails g model Reply content:string post_id:integer
$ rails db:migrate
cs


다음 각각 rb 파일에 다음의 코드를 통해 관계를 설정한다. belongs_to :post //  has_many :replies


1
2
3
4
5
\app\models\post.rb
has_many :replies
 
\app\models\reply.rb
belongs_to :post
cs


그 다음, 다음의 터미널 명령어를 통해 모델 Reply의 Controller를 만든다.


1
$ rails g controller replies 
cs


그리고 해당 컨트롤러의 액션을 정의해준다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\app\controllers\replies_controller.rb
 
def create
    @reply = Reply.new
    @reply.content = params[:content]
    @reply.post_id = params[:post_id]
    @reply.save
        
    redirect_to :back
end
 
    
def destroy
    @reply = Reply.find(params[:id])
    @reply.destroy
 
    redirect_to :back
end
cs


다음 View 중에서도 Post의 Show.html.erb 에서 Reply를 활용할 예정이므로 해당 view 파일에서 댓글창을 처리해준다.

이 때, 댓글 작성창과 더불어 post_id를 넘겨주기 위해서 hidden input element를 추가해준다.


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
\app\views\posts\show.html.erb
 
<%= render "navbar" %>
 
<div class="container">
 
    <div class="alert alert-dark" role="alert">
        <h2><%=@post.title%></h2>
        <hr>
        <%=@post.content%>
    </div>
    <a href="/posts/index">목록</a>
    <a href="/posts/edit/<%= @post.id %>">수정</a>
    <a href="/posts/destroy/<%= @post.id %>">삭제</a>
 
    <h2>댓글</h2><br>
    <form action="/replies/create" method="post">
        <input type="text" name="content" placeholder="댓글 내용을 입력하세요" style="width:80%"></input> 
        <input type="hidden" name="post_id" value=<%= @post.id %> ></input>
        <button type="submit" class="btn btn-primary">작성</button>
    </form>
    
    <% @post.replies.each do |r| %>
        <%= r.content %> 
        <a href="/replies/destroy/<%= r.id %>">삭제</a><br>
    <end %>
 
</div>
cs


마지막으로 Reply 모델의 Routing을 Route.rb에서 처리해준다.


1
2
3
4
5
6
\config\routes.rb
 
  # Reply ----------------------------------------
  post 'replies/create' => 'replies#create'
 
  get 'replies/destroy/:id' => 'replies#destroy'
cs