Web 관련/Ruby

Ruby #3_ 블로그(Blog) 만들기_게시판 제작(1)

Tigercow.Door 2017. 10. 17. 12:06

이번 포스팅 부터 진행해볼 Ruby on rails 프로젝트로는 

블로그(Blog) 만들기 입니다!

물론 다 만들고 실제로 사용하시려면 서버랑 db등도 공부하셔야해요^^..!

그래도 시작이 중요하다고 하니까?

한번 열심히 만들어 보도록 하겠습니다 :)
이후 추가적으로 기능이 구현될 예정입니다!

처음엔 아주 간단하게 틀만 잡을 거에요!


중간중간 코드 사진을 올려드리지만 예전에 찍어놨던 거라 그런지 화질이 많이 깨져요 :'(...
글 제일 하단에 실제 코드를 함께 올려 놓으니 참고하세요!

먼저 오늘은, 웹사이트 구성하고 게시물을 올리기 위해

model을 만들고 db를 구축하여 제목과 내용을 적어서 해당 제목과 내용이 저장되는 것 까지 확인할거에요.



먼저 Cloud9으로 workspace를 만들어줍니다!(템플릿은 Ruby입니다.)
workspace가 생성되면 bash창에 아래 명령어를 통해 controller와 view를 생성해줍니다.


rails g controller blog index




그리고 위 사진에서 보이는 8번 line에 bootstrap코드를 추가합니다.

bootstrap 4로 들어가셔서 아래 사진에 보이는 코드를 copy합니다.


bootstrap CDN이라고나와있는 부분의 코드를 복사하여 아까 열었던 application.html.erb파일의 8번 line에 붙여넣기 합니다.




그리고 Run을 하시면 기본페이지 밖에 안나올거에요.

이때 주소창 맨뒤에 /blog/index 를 입력하시면 아래와 같은 화면이 출력됩니다.



아직 route설정이 되지 않아서 발생하는 문제(?)인데요. 바로 해결하러 갑니다.
다시 돌아와서 Ctrl+e 를 눌러주면 좌측에 파일 및 폴더를 검색할 수 있는 창이 뜹니다. route라고 검색하고 아래와 같이 파일을 엽니다.





routes.rb 파일을 열면, 2번 line에 아래 코드가 작성되어 있을 겁니다.


get 'blog/index'


아까 우리가 주소창 맨 뒤에 입력했던 내용입니다. 해당 코드를 아래와 같이 수정합니다.


get '/' => 'blog#index'



위의 코드를 통해 우리가 주소창에 추가적으로 주소설정을 하지 않아도 blog밑에 있는 index의 view를 볼 수 있게됩니다.

저장하시고 확인하실 수 있습니다.

(전에 주소창에 입력했던 blog/index를 지워야해요.)
이제 내용을  채우기 위해 다시 bootstrap 4로 들어갑니다.
bootstrap 4 페이지 최상단에 documentation을 들어가서 우측에 있는 bar에서 Components, Forms로 들어갑니다.

그리고 스크롤을 조금 내리시면 있는 Form controls의 코드를 copy합니다.
그리고 다시 c9으로 돌아와서 index.html.erb 파일을 열어 원래있던 두줄의 코드를 모두 지워주시고 copy한 내용을 모두 붙여 넣습니다.



위와 같은 코드를 확인하실 수 있을 겁니다.
이 상태에서 Run하시고 확인하시면 다양한것들이 많이 있는데 이중에서 우리에게  필요한 것들만 남기고 모두 지워버리겠습니다.
label for= 뒤에 exampleInputEmail 과 exampleTextarea가 적힌 두가지 div과 button을 제외하고 모두 지웁니다.

남은 코드를 확인하면 아래와 같습니다.




남은 코드들도 우리가 사용할 목적에 맞게 약간 수정합니다.

먼저 크게는 5번 line을 삭제하구요 label for뒤의 이름을 바꿔줍니다. 수정후 코드는 아래와 같습니다.




지금까지 작성한 코드를 통해 Run하시면 아래와 같은 화면이 출력됩니다.



이제 model을 생성하고 db를 구축할 거에요. 맨 처음에 명령어를 입력했던 bash 창에 아래와 같은 명령어를 입력합니다.


rails g model post


그럼 db/migrate 아래에 숫자가 섞인 파일이 생성되는데 해당 파일을 열어서 아래 사진의 4번,5번 line 코드를 추가합니다.




지금 db에 저장되는 항목의 이름을 설정(?) 하였구요. 이제 우리가 제목과 내용을 입력하고 버튼을 눌렀을때 해당 내용이 db에 저장될수 있도록 하겠습니다.
app/controllers/blog_controller.rb 파일을 열어서 아래 사진의 5번~12번 line을 작성합니다.




코드에 대해 간단히 설명드리면, post라는 새로운 함수를 만들었습니다.

해당함수에서는 우리가 만들었던 Post라는 model을 새로 만들어서 (Post.new), post라는 변수를 선언합니다.
그리고 post.title에는 우리가 입력한 title의 내용을 저장하기위해 params를 통해 title을 찾아 내용을 저장하고 content또한 동일합니다.
그렇게 입력된 post를 post.save를 통해 저장합니다.
그리고 11번 라인의 redirect_to '/'는 추후 routes와 관련되서 함께 이야기할게요.
이제 우리가 버튼을 눌렀을때 post함수가 실행될 수 있도록 하겠습니다.
다시 index.html.erb 파일을 열어서 1번 line을 아래와 같이 수정합니다.


<form action="post" method="get">



위의 코드를 통해서 좀전 controller 파일에서 생성한 post함수가 버튼을 누름으로써 실행됩니다.
이제 다시 bash 창에 아래 명령어를 통해 db를 실제로 만들어줍니다.


rake db:migrate


db를 만든뒤에는 preview를 stop하고 다시 Run하셔야 합니다.
그렇게 해서 만들어진 페이지를 확인하면 아래와 같습니다.



아까와 큰 차이가 없죠? title과 content를 입력하고 submit 버튼을 눌러봐도 페이지에 변함이 없습니다.
이는 지금까지 우리가 db를 생성하고 db에 title과 content가 저장되게끔만 하였지 이를 출력하도록하지 않아서 그래요.
다시 C9으로 돌아가서 blog_controller.rb 파일을 열어서 def index와 end 사이에 아래의 코드를 입력해줍니다.


@posts = Post.all



위의 코드를 통해 @posts가 Post에 저장되어 있는 모든 요소를 받습니다. 이제 이 항목들을 출력하겠습니다.
index.html.erb파일로 돌아갑니다.
그리고 코드 하단에 아래 사진과 같이 코드를 추가합니다.




15번 ~23번 line이 추가한 코드인데, @posts에서 각각의 항목을 모두 불러와 출력하도록 하는 code입니다.
마지막으로 routes.rb 파일로 들어갑니다
그리고 아까 작성하였던 2번 line 밑에 아래 코드를 추가합니다.


get '/post' => 'blog#post'


위의 코드를 통해서 버튼을 눌러 아까 설정한 action이 실행되면 /post 주소로 넘어가게 되는데 그것을 blog아래의 post로 보내도록 설정합니다. 헌데 현재 post에 대한 view가 없기에 오류가 뜰텐데 이부분은 아까 controller 파일에 작성했던


redirect_to '/'


라는 코드가 해결해 줍니다.
post라는 action이 실행되고 위의 코드를 통해 다시 원래주소로 돌아가는 것입니다. 
여기 까지 한 것을 통해 페이지를 확인하시고 title과 content를 입력하고 버튼을 누르면 아래와 같이 됩니다.




이렇게 하여 간단하게 제목과 내용을 입력하고 이를 db에 저장하였습니다.
각 파일에 대한 코드는 아래와 같습니다.


#index.html.erb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form action="/post" method="get">
  <div class="form-group">
    <label for="inputTitle">TITLE</label>
    <input type="text" class="form-control" name="title" placeholder="Enter title">
  </div>
 
  <div class="form-group">
    <label for="inputContent">CONTENT</label>
    <textarea class="form-control" rows="3" name="content"></textarea>
  </div>
  
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
 
<div class="container">
    <ul>
        <% @posts.each do |p| %>
            <li>제목 : <%= p.title %></li>
            <li>내용 : <%= p.content %></li>
        <end %>
    </ul>
    
</div>
cs


#blog_controller.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class BlogController < ApplicationController
  def index
    @posts = Post.all
  end
  
  def post
    post = Post.new
    post.title = params[:title]
    post.content = params[:content]
    post.save
    
    redirect_to '/'
  end
end
 
cs


#application.html.erb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html>
<head>
  <title>Workspace</title>
  <%= stylesheet_link_tag    'application', media: 'all''data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application''data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
  
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
 
</head>
<body>
 
<%= yield %>
 
</body>
</html>
 
cs



#routes.rb

1
2
3
4
5
6
7
8
Rails.application.routes.draw do
  get '/' => 'blog#index'
 
  get '/post' => 'blog#post'
 
 
end
 
cs



#db/migrate 안에 있는 파일

1
2
3
4
5
6
7
8
9
10
class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :title
      t.string :content
      t.timestamps nullfalse
    end
  end
end
 
cs



이렇게 해서 Ruby on rails를 통해 간단한 블로그의 틀을 잡아봤습니다!

다음엔 게시글을 수정하거나 삭제하는 등의 기능을 추가해보는 것을 구현해보도록 할게요!

궁금하신 사항등의 모든 문의는 댓글을 달아주시거나

doorbw@outlook.com 으로 메일주세요 :)

728x90

'Web 관련 > Ruby' 카테고리의 다른 글

Ruby #2_ 영화검색 사이트 만들기(2)  (0) 2017.10.16
Ruby #1_ 영화검색 사이트 만들기(1)  (0) 2017.10.15