TigerCow.Door

이번 포스팅 부터 진행해볼 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 으로 메일주세요 :)

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

지난 포스팅에 이어서 계속 진행합니다!

영화를 검색하기 위해 영화제목 입력창과 버튼을 추가합니다.

bootstrap에서 CSS->우측 Forms에 들어가서 처음보이는 code를 복사해 필요한 부분만 남겨두고 지워버리겠습니다.

위의 그림에 보이는 code를 복사하여 index.html.erb 파일의 상단에 붙여놓고 필요한 부분만 남기고 지우겠습니다.







지금까지 작성한 code로 run하면 아래와 같이 화면이 구성됩니다.





이제 model 개념을 사용합니다.

bash 창에 아래와 같은 명령어를 입력합니다.


rails g model list

그리고 


rake db:migrate


( ':' 양쪽에 공백이 있으면 안돼요!)
두 명령어를 입력하면 아래 사진과 같이 db/migrate 에 새로운 파일이 생깁니다. 해당 파일의 코드를 확인할게요




해당 파일에서 t.timestamps null: false 코드 위에 아래 코드를 입력합니다.


t.string :title


지금까지 한건, 사용자가 영화제목을 입력해서 검색한 것을

db에 저장해서 정보를 갖고 있도록 하기위해 db구축(?)을 한 과정입니다.

이제 이렇게 db에서 갖고있는 정보를 화면에 띄우도록 할게요.
먼저, 버튼을 눌렀을때 새로운 영화정보가 추가된 페이지가 되도록 routes.rb 파일의 코드를 수정하겠습니다.



이렇게 
get 'new_movie' => 'movie#new_movie' 를 추가하고 이제 movie_controller.rb 파일로 넘어갑니다.
movie_controller.rb 파일에서 new_movie라는 함수를 설정해서

사용자가 영화제목을 입력하고 버튼을 눌렀을때 입력한 text를 통해 json정보를 받습니다.

그리고 해당 영화의 정보가 존재하는지 Response 값을 확인한뒤 True인 경우 db에 저장하도록 합니다.

코드를 확인하면 아래와 같고 추가적으로 index함수내에서도 바뀐 부분을 확인해야 합니다.

26번줄과 31번줄의 코드가 변경되었습니다.



그리고 이제 버튼을 눌렀을때 controller에서 새롭게 설정한 함수가 실행되도록 해야하는데

이것은 index.html.erb 파일에서 코드를 수정합니다.




위의 사진에서 2번줄을 보시면 action 구문이 추가되었습니다.

어떠한 함수를 실행할지 설정해주었구요,

5번줄에 name="title"이란 코드도 추가되어 사용자가 input에 입력한 text의 이름을 설정해주었습니다.

이렇게 까지하시면 page를 run 하셨을때 어떤 영화의 정보도 존재하지 않지만,

적절한 영화의 제목을 입력하고 추가하면 영화의 정보가 새로 생깁니다.

하지만 입력한 text에 대한 영화정보가 없다면 영화정보가 추가되지 않습니다.
마지막으로 보기좋게끔 css등의 파일의 코드를 수정하고,

영화에 대한 보다 많은 정보를 받을 수 있게끔하며, 

youtube 주소를 이용해서 해당 영화에 대한 관련 영상을 볼 수 있는 링크를 걸게 하였습니다.
먼저 최종 결과화면은, 





이렇게 나왔습니다.

각 코드들은 아래와 같습니다.


routes.rb


application.html.erb


movie_controller.rb


index.html.erb


movie.css


db/migrate/~lists 파일


코드는 위에 나온 사진들 외에는 따로 수정한 파일 없습니다.
이렇게해서 오늘 LIKELION에서 학습한 내용 한번 쭉 복습했네요.
저도 많이부족해서 제대로 설명이 되지 않았거나 잘못 된 부분들도 많을텐데

전문가분들께서 보시고 피드백주시면 정말 감사하겠습니다^^

다음번에 더 공부해서 더 좋은 내용으로 포스팅할게요~



블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc

cloud9 을 이용해서 ruby언어를 통해 영화검색 사이트를 만들거에요.

처음이신분들도 쉽게 따라올 수 있도록 진행하겠습니다.


먼저 c9을 이용해서 workspace를 만들어줍니다. 언어는 Ruby를 사용합니다! 




개발환경을 구축하기 위해 bash창에 아래와 같은 명령어를 입력하여 movie라는 controller를 생성합니다.


rails generate controller movie index


그럼 좌측에서 app폴더안에 controllers폴더 안에 views 폴더에서 movie라는 폴더가 생긴것을 확인하실수 있습니다.
그리고 index.html.erb파일을 먼저 작성해보도록 할게요!




그리고 위의 index.html.erb 파일에서 먼저 구조를 잡도록 할게요.




위와 같이 초기 구조를 잡았습니다.
그리고 저장한뒤에 run을 해준뒤 페이지를 열어보면 기본창 밖에 뜨지 않는데

이때 주소창 맨 뒤에 /movie/index 를 입력해주면 빈 화면이 뜹니다.
여기서 route를 설정함으로써 /movie/index 를 입력해주지 않아도 우리가 개발하는 페이지가 뜰도록 할게요.
아래 그림과 같이 config 폴더 안의 routes.rb 파일을 열어서 
root 'movie#index' 코드를 추가해줍니다.





 이렇게 하고 저장하신뒤에 page를 확인해보시면

주소 맨 뒤에 /movie/index를 추가하지 않으셔도 우리가 coding중인 page로 접속됩니다.
그리고 이제 bootstrap을 사용하기 위해 bootstrap 페이지에서 getting started로 들어가

아래 그림에 보이는 코드를 복사할게요.



그리고 c9에서 app/views/layouts/application.html.erb 파일로 들어가 </head> 위에 복사한 코드를 붙여 넣습니다.





그리고 다시 app/assets/sylesheets/movie.scss 파일을 열어서 아래와 같이 코드를 작성합니다.






여기까지 하셨으면 page run 하셨을때 화면의 가운데에 3:9의 비율로
빨간색, 파란색 선이 보이실 거에요.

css파일에서 설정해준것과 같이 빨간색은 poster부분이고 파란색은 content부분인데

따로 height를 설정하지않아서 선처럼 나오는 겁니다.

색깔은 제대로 되었는지 확인하기 위해 넣은 것이므로 확인되신분들은 빼셔도 됩니다! (저도 빼고 진행할게요.)


이제 영화의 정보를 가져올건데요. http://www.omdbapi.com/?t= 의 사이트에서

?t= 뒤에 영화제목을 입력하셔서 확인해보시면 json형태로 영화정보가 나오는 것을 확인하실 수 있습니다!
위의 사이트에서 정보를 가져와 저희가 coding중인 사이트에 뜨도록 할거에요.

그것을 하기위해 app/controllers/movie_controller.rb 파일에서 code를 작성합니다.




위와 같이 작성하시면, 현재 @movie_info에 star wars와 harry potter의 정보가 들어 갔음을 뜻합니다.

이제 이것들을 확인하기위해 다시 index.html.erb 파일과 movie.scss 파일에 들어가서 코드를 수정할게요.





위와 같이 코드를 수정하시고 확인하면 page에 star wars 와 harry potter의 정보가 뜨는 것을 확인할 수 있습니다.
.scss는 개인적으로 보기 이쁘게끔 수정하시면 됩니다. 이후 .scss파일 수정한 내용에 대해서는 따로 언급하지 않고 맨 마지막에서 전체적인 코드만 올릴게요!

이후 포스팅에선 사용자가 원하는 영화 이름을 입력해서 그 영화의 정보를 가져오는 기능을 구현하겠습니다.


블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc