본문 바로가기

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

RubyOnRails 1) CRUD 기본

RubyOnRails 1) CRUD 기본


루비온 레일즈 웹 프레임워크의 기본인 CRUD에 대해서 살펴보고자 한다.

먼저 레일즈 프로젝트를 만들어준다.


1
$ rails new project

cs


그리고 Post 모델을 만들어준다.

해당 Post 모델은 string 형의 title 이라는 field와 string 형의 content field를 지니고 있다.


1
$ rails g model Post title:string content:string
cs


그리고 해당 모델의 동작을 담당할 controller를 만들어준다(여기서는 view 파일이 필요한 액션만 미리 정의해주는 게 편리)


1
$ rails g controller Posts new index show edit
cs


다음, 암호화의 토큰을 꺼주기 위해 다음의 코드를 주석처리해준다.


1
2
3
4
5
\app\controllers\application_controller.rb
 
class ApplicationController < ActionController::Base
  # protect_from_forgery with: :exception
end
cs


그리고 여기서 Bootstrap을 통해 view (html) 를 편하게 사용하려고 한다.

그렇기 때문에 다음의 코드를 입력한다.


1
2
3
4
5
6
\app\views\layouts\application.html.erb
<!-- Bootstrap -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
cs


그리고 Route.rb 파일에서 다음의 주소 라우팅을 정리해준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
\config\routes.rb
  root 'posts#index'

  # Post ---------------------------------
  get 'posts/new'
  post'posts/create'

  get 'posts/index'
 
  get 'posts/show/:id' => 'posts#show'
 
  get 'posts/edit/:id' => 'posts#edit'
  post'posts/update/:id' => 'posts#update'
 
  get 'posts/destroy/:id' => 'posts#destroy'
  # Post ---------------------------------
cs


다음, controller의 액션들을 정의해준다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
\app\controllers\posts_controller.rb
 
class PostsController < ApplicationController
 
 # C 만들기------------------------------------------------
  def new
  end
 
  def create  
    
    @post = Post.new 
    @post.title = params[:title]
    @post.content = params[:content]
    @post.save
    
    redirect_to "/posts/index"
  end
 
  # R 보기------------------------------------------------
  def show
    @post = Post.find(params[:id]) # 해당 Post 객체 찾기
  end
 
  def index
    @posts = Post.all.reverse
  end
 
  # U 수정하기------------------------------------------------
  def edit
    @post = Post.find(params[:id]) # 해당 Post 객체 찾기
  end
 
  def update
    @post = Post.find(params[:id]) # 해당 Post 객체 찾기
    @post.title = params[:title]
    @post.content = params[:content]
    @post.save
    
    redirect_to "/posts/show/#{@post.id}"
    
  end
 
  # D 삭제하기------------------------------------------------  
  def destroy
    
   @post = Post.find(params[:id]) # 해당 Post 객체 찾기
   @post.destroy
 
   redirect_to "/posts/index"
  end
 
end
 
cs


그리고 각 view 파일들을 정리해준다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
\app\views\posts\new.html.erb
 
<%= render "navbar" %>
 
<div class="container">
    <h1>새 글 작성_게시판 </h1>
 
    <form action="/posts/create" method="post" enctype="multipart/form-data">
 
      title:<br> <input type="text" name="title" placeholder="제목을 입력하세요" style="width:80%"><br>
      content:<br> <textarea name="content"  placeholder="내용을 입력하세요" style="width:80%" rows="10"></textarea><br>
      <button type="submit" class="btn btn-primary">작성</button>
 
    </form>
</div>
 
 
\app\views\posts\index.html.erb
 
<%= render "navbar" %>
 
<div class="container">
    <table class="table">
    <thead class="thead-dark">
        <tr>
        <th scope="col">#</th>
        <th scope="col">Title</th>
        <th scope="col">User</th>
        </tr>
    </thead>
    <tbody>
        <% @num = 1%>
        <% @posts.each do |p| %>
            <tr>
            <th scope="row"><%=@num%></th>
            <td><a href="/posts/show/<%=p.id%>"><%=p.title%></a></td>
            <td>user</td>
            </tr>
            <% @num += 1 %>
        <end %>
    </tbody>
    </table>
    <a href="/posts/new"><button class="btn btn-secondary">글쓰기</button> </a>
</div>
 
\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>
 
</div>
 
\app\views\posts\edit.html.erb
 
<%= render "navbar" %>
 
<div class="container">
    <h1> 수정하기 </h1>
 
    <form action="/posts/update/<%=@post.id%>" method="post" enctype="multipart/form-data">
 
      title:<br> <input type="text" name="title" value= "<%= @post.title %>" style="width:80%"><br>
      content:<br> <textarea name="content" style="width:80%" rows="10"><%= @post.content%></textarea><br>
      <button type="submit" class="btn btn-primary">작성</button>
 
    </form>
</div>
 
 
cs