スポンサーリンク

2015年5月27日

[Sinatra+MongoDB]Sinatraの掲示板にMongoDBを使ってみた。

タイトル:[Sinatra+MongoDB]Sinatraの掲示板にMongoDBを使ってみた。

目的:Sinatraで作成した掲示板を改良する。書き込みデータの管理にMongoDBを使用する。

実施環境:
OS:Windows8.1
Ruby:v2.2.2
Sinatra:v1.4.6
Haml:v4.0.6
mongo(gems):v2.0.4
MongoDB:mongodb-win32-x86_64-2008plus-ssl-3.0.3-signed


ディレクトリ構造:
作業ディレクトリ
|-sinatra_start.rb(rubyファイル)
|
|-views(ディレクトリ)
|   |-index.haml(hamlファイル)
|
|-db
    |-MongoDBによって作成されるファイル複数

目次:

  1. 概要
  2. Ruby(Sinatra)のソースコード修正
  3. Hamlのソースコード修正
  4. 説明
  5. 実行

掲示板のプログラムや説明に関しては、
以前記事を書いているので、そちらを参考にして頂ければ分かりやすいと思います。
また、ソースコードも以前の記事にあるものを修正したものになります。
Sinatraで掲示板を作ってみた!!

また、MongoDBの起動方法等については、
以下の記事を参考にして頂ければ分かりやすいと思います。
MongoDBを使ってみる。

1.概要

1.1
以前、Sinatraで作成した掲示板。
書き込みデータの管理はCSVで行っていた。
その部分をMongoDBに書き換える。

以下の点に注意
  • DBのソースコード部分はべた書きである
  • Modelクラスの作成はない
  • Validationによる入力データの検証は行っていない

2.Ruby(Sinatra)のソースコード修正

2.1
Ruby(Sinatra)側のソースコードは以下の通り修正した。
# encoding: utf-8
# File Name: sinatra_start.rb
# Create Day is 2015/05/20
# Last Update Day is 2015/05/27
# Gem List
gem 'tilt', '1.4.1'
# Require List
require 'sinatra'
# sinatra reloader is classic type
require 'sinatra/reloader' if development?
require 'haml'
require 'tilt'
require 'mongo'
# 外部エンコーディングを変更
Encoding.default_external = "UTF-8"
get '/' do
db = Mongo::Client.new(["127.0.0.1:27017"], :database => 'sinatra_bbs')
@title = "Welcom to Sinatra BBS!!"
@comments_data = db[:comments].find
haml :index
end
put '/write_comment' do
db = Mongo::Client.new(["127.0.0.1:27017"], :database => 'sinatra_bbs')
db[:comments].insert_one({
:name => params[:name],
:title => params[:title],
:comment => params[:message]
})
redirect '/'
end

3.Hamlのソースコード修正

3.1
Haml側のソースコードは以下の通り修正した。
!!!
%html{:lang => "ja"}
%head
%title= @title
%meta{:content => "text/html", :"http-equiv" => "Content-Type", :charset => "utf-8"}
%body
%h1 #{@title}
%h2 Comment Write
%form{:method => "POST", :action => '/write_comment'}
%input{:type => "hidden", :name => "_method", :value => "PUT"}
%table
%tr
%td Your Name
%td
%input{:type => "text", :name => "name"}
%tr
%td Title
%td
%input{:type => "text", :name => "title"}
%tr
%td Comment
%td
%input{:type => "text", :name => "message"}
%tr
%td
%td
%input{:type => "submit", :value => "Comment"}
%input{:type => "reset", :value => "Reset"}
%h2 Comments List
%table{:border => "1", :bordercolor => "#000000"}
%tr
%th Name
%th Title
%th Comment
- @comments_data.each do |comment|
%tr
%td= comment[:name]
%td= comment[:title]
%td= comment[:comment]
view raw index.haml hosted with ❤ by GitHub

4.説明

4.1
「get '/' do」のデータ取得の修正部分。

CSV.read("db/sinatra_bbs.csv")
の部分を

db[:comments].find
に変更している。
(DBの接続部分もあるが、これだけ)

4.2
「put '/write_comment' do」のコメント書き込みの修正部分。

CSV.open("db/sinatra_bbs.csv", "a") do |csv|
csv << [params[:name], params[:title], params[:message]]
end
の部分を

db[:comments].insert_one({
:name => params[:name],
:title => params[:title],
:comment => params[:message]
})
に変更している。
(DBの接続部分もあるが、これだけ)

5.実行

5.1
以下のコマンドを実行する。
コマンド:ruby sinatra_start.rb

5.2
以下のURLにアクセスする。
(なお、ポートを変更している方は変更したポート番号を指定する)
URL: http://localhost:4567

実行による表示は以前の記事(Sinatraで掲示板を作ってみた!!の実行画像)から変わらない。
プログラム内部でのデータの取得と挿入がDBに変わっているだけである。
(微妙にボーダー入ってるかもですけど、気にしないこと・・・)

以上!!

以下、参考にさせて頂いたサイト様
なし

管理人の独り言
本日、2度目の投稿。
丁度、MongoDBのBSONドキュメントのアクセスまでやったから、ついでに掲示板の方も修正~

そういえば、React.jsが熱いらしいと聞いた。
ただ、小規模ならAngular.js、Vue.jsで十分とも聞くし、どうしたものか・・・
いずれにせよ、使うかどうかともかく情報としては押さえておこうかと思います。
じゃないと自分が使うのに何が良いか検証もできないですし・・・

しっかし、やはりソースコードがインデントで見辛いな、どうにかならないかな・・・

人気の投稿