Ruby 초보자가 공부회에 참가해 보았다(전 7회) 제3회 & 4회 ②

17401 단어 공부회
3번째 것도 note에는 투고했지만,
이쪽에서는 복습도 겸해 3회와 4회를 정리해 기재해 갑니다!
(길어질 것 같아서 여러 번 나눕니다!)

최종 목적 : sinatra로 간단한 게시판 앱 만들기



이번은 게시판 앱이므로 create_board_contets.rb 파일을 작성.$ touch create_board_contets.rb
create_board_contets.rb
require 'pg'

# herokuから持ってきた情報を記入
conn = PG::connect(
  host: '',
  user: '',
  password: '',
  dbname: '',
  port: ''
)
conn.exec("
  CREATE TABLE board_contents (
    id serial,
    name text,
    comment text,
    commented_at timestamp,
    PRIMARY KEY (id)
  );"
)

테이블을 만들기 위해 루비 파일을 실행합니다.$ ruby create_board_contets.rb이제 데이터베이스에 board_contents라는 테이블이 만들어집니다!

PGcommander에서도 확인.


board_contents에서 데이터를 가져오려면,
app.rb를 수정합니다.

app.rb
get '/' do

  conn = PG::connect(
    host: '',
    user: '',
    password: '',
    dbname: '',
    port: '5432'
  )

  @data = conn.exec("select * from board_contents;")
  conn.finish
  erb :index
end

뷰에 반영시키기 위해 index.erb도 수정.

index.erb
<h1>hello world</h1>
<ul>
<% @data.each do |mes| %>
  <li><%= mes["id"] %>
    /
    <%= mes["name"] %>
    /
    <%= mes["comment"] %>
  </li>
<% end %>
</ul>

이 상태에서는 데이터의 정보 둥근 모양이므로,
DB 연결 정보를 숨기기 위해 dotenv를 소개합니다.

Gemfile.
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"

gem 'sinatra'
gem 'sinatra-contrib'
gem 'pg'
gem 'dotenv' # ここを追記
$ bundle install 잊지 마세요.

환경 변수를 설정하는 .env 파일을 새로 작성합니다.

env.
DATABASE_HOST=''
DATABASE_USER=''
DATABASE_PASSWORD=''
DATABASE_NAME=''
DATABASE_PORT=''


.env에서 얻은 정보로 postgresql에 액세스하려면,
app.rb를 수정합니다.

app.rb
require 'sinatra'
require 'sinatra/reloader'
require 'pg'
require 'dotenv/load' # 追加

get '/' do
  conn = PG::connect(
    host: ENV['DATABASE_HOST'], ⇦環境変数
    user: ENV['DATABASE_USER'],
    password: ENV['DATABASE_PASSWORD'],
    dbname: ENV['DATABASE_NAME'],
    port: ENV['DATABASE_PORT']
  )
  @data = conn.exec("select * from board_contents;")
  conn.finish
  erb :index
end

여기까지 할 수 있으면, 드디어 투고 폼을 작성해 갑니다.
· 양식을 사용하여 POST 요청을 실행할 수 있습니다.

index.erb
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <ul>
      <% @data.each do |mes| %>
        <li><%= mes["id"] %>/<%= mes["name"] %>/<%= mes["comment"] %></li>
      <% end %>
    </ul>
    <form action="/comments" method="post">
      名前:<input type="text" name="name">
      コメント:<input type="text" name="comment">
            <!-- 送信ボタン -->
      <input type="submit" value="送信する">
    </form>
  </body>
</html>

한 번 확인해 보니 무사히 표시되었습니다.
↓↓


하지만 form의 액션을 실행하는 처리가 아직이므로,
POST 메소드를 추가하겠습니다.

app.rb
# 下記を追記
post '/comments' do
  p params["name"]
  p params["comment"]
end

POST된 데이터를 DB에 저장하는 처리를 한다.



아까 추가한 포스트 부분을 아래에 수정.

app.rb
post '/comments' do
    # paramsでデータを受け取る
    name = params["name"]
  comment = params["comment"]
    # dbに接続
    conn = PG::connect(
    host: ENV['DATABASE_HOST'],
    user: ENV['DATABASE_USER'],
    password: ENV['DATABASE_PASSWORD'],
    dbname: ENV['DATABASE_NAME'],
    port: ENV['DATABASE_PORT']
  )
    # sqlを組み立てる
    sql = "INSERT INTO board_contents (name, comment) VALUES ('#{name}', '#{comment}');"
  # sqlを実行する
    @data = conn.exec(sql)
end

PG commander 등의 도구로 반영되어 있는지 확인!



안전하게 반영됩니다!

이것으로 간단한 게시판 앱의 완성입니다.

데이터베이스 접속 처리를 함수화해 보자.



app.rb
# 文字列で受け取ったsqlを実行する関数
def postgres(sql)
  conn = PG::connect(
    host: ENV['DATABASE_HOST'],
    user: ENV['DATABASE_USER'],
    password: ENV['DATABASE_PASSWORD'],
    dbname: ENV['DATABASE_NAME'],
    port: ENV['DATABASE_PORT']
  )
  data = conn.exec(sql)
  conn.finish
  data
end

get '/' do
  @data = postgres("select * from board_contents;")
  erb :index
end

post '/comments' do
    name = params["name"]
  comment = params["comment"]
  sql = "INSERT INTO board_contents (name, comment) VALUES ('#{name}', '#{comment}');"
  @data = postgres(sql)
  redirect '/'
end

또한 모듈화도 해본다.


$ touch mydatabase.rb
mydatabase.rb
require 'pg'
require 'dotenv/load'

module Mydatabase
  def self.exec(sql)
    @conn = PG.connect(
        host: ENV['DATABASE_HOST'],
        user: ENV['DATABASE_USER'],
        password: ENV['DATABASE_PASSWORD'],
        dbname: ENV['DATABASE_NAME'],
        port: ENV['DATABASE_PORT']
    )
    data = @conn.exec(sql)
    @conn.finish
    data
  end
end

app.rb도 수정한다.

app.rb
require 'sinatra'
require 'sinatra/reloader'
require 'pg'
require 'dotenv/load'
require './mydatabase' # moduleの読み込み

get '/' do
    # moduleを使ったDBアクセス
  @data = Mydatabase.exec("select * from board_contents;")
  erb :index
end

post '/comments' do
  name = params["name"]
  comment = params["comment"]
  sql = "INSERT INTO board_contents (name, comment) VALUES ('#{name}', '#{comment}');"
  # moduleを使ったDBアクセス
    @data = Mydatabase.exec(sql)
  redirect '/'
end

만약을 위해, 제대로 표시되고 있는지 확인.



무사, module화도 완료!

이번 공부회에서는 마지막으로 스크래핑도 했습니다.
이쪽은 또 길어질 것 같기 때문에,
별도로 정리해 가고 싶습니다.

좋은 웹페이지 즐겨찾기