Ruby 초보자가 공부회에 참가해 보았다(전 7회) 제3회 & 4회 ②
17401 단어 공부회
이쪽에서는 복습도 겸해 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화도 완료!
이번 공부회에서는 마지막으로 스크래핑도 했습니다.
이쪽은 또 길어질 것 같기 때문에,
별도로 정리해 가고 싶습니다.
Reference
이 문제에 관하여(Ruby 초보자가 공부회에 참가해 보았다(전 7회) 제3회 & 4회 ②), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hum527/items/4f01a2eedb01dd5cb760텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)