• 検索結果がありません。

Sinatra と MongoDB 今回は Sinatra で MongoDB の操作を体験してみます 進捗に合わせて ドライバから Ruby で使える便利な ORM の紹介をします

N/A
N/A
Protected

Academic year: 2021

シェア "Sinatra と MongoDB 今回は Sinatra で MongoDB の操作を体験してみます 進捗に合わせて ドライバから Ruby で使える便利な ORM の紹介をします"

Copied!
43
0
0

読み込み中.... (全文を見る)

全文

(1)

Sinatra

MongoDB

Sinatra

MongoDB

Powered by Rabbit 2.1.2 and COZMIXNG

(2)

SinatraとMongoDB

今回はSinatraでMongoDBの操作 を体験してみます。 進捗に合わせて、ドライバから Rubyで使える便利なORMの紹介を します。

(3)

SinatraとMongoDB

まずは初回なのでSinatraの基本か

(4)

Hello world

require 'sinatra'

get '/' do

"Hello, world!"

(5)

Hello world

これは最も単純で有名な例ですが、 HTTPヘッダを見てみましょう。

(6)

Hello world

ブラウザにはこういったヘッダーの 情報を確かめる機能が備わっていま す。 その中でも重要なのがRequest MethodGETであるという点で す。

(7)

HTTP Method

これらのGETはHTTP Methodの一

部で、主にGETやPOSTが使われて

います

GET POST PUT DELE

TE OPTION 何か 見せ る 何か 生成 する 何か 更新 する 何か 削除 する 何か 満た す http://www.sinatrarb.com/intro-ja.html より引用

(8)

POST

では、次にpostメソッドを試して みましょう require 'sinatra' post '/' do "Hello world!" end

(9)

POST

$ curl -X POST http://localhost:4567

(10)

POST

require 'sinatra' post '/' do "Hello world!" end get '/' do erb <<EOF

<form method='post' action='/'> <input type='submit' /> </form>

EOF

(11)

POST

ただし、POSTコマンドは通常では

値の取得には用いません

値を取得するときにはGETを使い

(12)

MongoDB

それでは実際にデータを保存するた

(13)

MongoDB

インストールは行ってきましたか? $ which mongo

(14)

MongoDB

まずは基本から。

$ mongo # クライアントの起動 > db # 現在のテーブル

> use foo # foo をこれから使用(この時点ではまだ書き込まれていない) > db # foo

(15)

MongoDB

外部接続の場合。

(16)

MongoDB

まずは基本から。 > a = { name: 'Frank' }

> db.sinatraDB.insert(a) # 挿入

> show collections # sinatraDBが書き込まれている > db.sinatraDB.find() # 検索

(17)

MongoDB

$ gem install mongo bson_ext bson_extはmongoライブラリに BSON形式をサポートさせるための Gemです

(18)

MongoDB

require 'sinatra'

require 'mongo'

include Mongo # Mongoの省略

configure do

conn =MongoClient.new # localhost:27017

set connection: conn

set db: conn.db('foo') # use foo

end

get '/collections' do

settings.db.collection_names.to_a.to_s # show collections と同じ

(19)

MongoDB

require 'sinatra' require 'mongo' get '/' do

# ドキュメント全体

settings.db['sinatraDB'].find.to_a.to_s

end

get '/:collection' do |col|

# name が collectionであるものをひとつ返す

settings.db['sinatraDB'].find_one(name: col).to_s

(20)

Haml

テンプレートエンジンを使います $ gem install haml

(21)

Haml

テンプレートエンジンを使います

get '/' do

haml :index

(22)

Haml

./views/index.haml

%form{action: '/', method: 'post'}

%input{name: 'name', placeholder: 'name'} %input{type: 'submit'}

注意:インデント幅はソフトスペー

(23)

MongoDB

Sinatraからデータを登録します

post '/' do

bson_id = settings.db['sinatraDB'].insert(params) bson_id.to_s

end

(24)

MongoDB

BSON_IDからの検索?

get '/id/:id' do |id|

settings.db['sinatraDB'].find(id).to_s

(25)

MongoDB

BSON_IDからの検索

get '/id/:id' do |id|

id = BSON::ObjectId.from_string(id)

settings.db['sinatraDB'].find(id).to_s

(26)

ヘルパー

helpers do def foo 'baz' end end

(27)

ヘルパー

または module Foo def foo 'baz' end end helpers Foo

(28)

ヘルパー

# Haml, Slim = foo

# ERB

(29)

ヘルパー

helpers do

def find_by_name(name)

settings.db['sinatraDB'].find(name: name)

end

def find_all

settings.db['sinatraDB'].find

end

(30)

ヘルパー

= find_by_name.count

%ul

- find_by_name('Frank').each do |document|

(31)

データの更新

./views/index.haml %ul

- find_all.each do |document| %li

(32)

データの更新

ルーティング get '/update/:id' do |id| @id = id haml :update end

(33)

データの更新

./views/update.haml

%h1= find_by_id(@id)

%form{action: "/update/#{@id}", method: 'post'}

%input{name: 'name', value: find_by_id(@id)}

(34)

データの更新

ヘルパー

helpers do

def find_by_id(id)

id = BSON::ObjectId.from_string(id)

settings.db['sinatraDB'].find_one(id)['name'] end

(35)

データの更新

post '/update/:id' do |id|

id = BSON::ObjectId.from_string(id)

settings.db['sinatraDB'].update({_id: id}, params) redirect '/'

(36)

データの削除

./views/index.haml

%ul

- find_all.each do |document| %li

= document['name'] |

%a{href: "/update/#{document['_id']}"} 更新 |

(37)

データの削除

ルーティング

get '/delete/:id' do |id|

id = BSON::ObjectId.from_string(id)

settings.db['sinatraDB'].remove(_id: id)

redirect '/' end

本来はPOSTを使うのですが、今回

は操作感を重視してGETを使いま

(38)

データの追加

はじめに追加した部分もredirectに

書き換えましょう

post '/' do

settings.db['sinatraDB'].insert(params)

redirect '/' end

(39)

未完了と完了

ようやくToDoリストを作り始める

基礎をおさえることができました。 今度はそれぞれのタスクが完了して いるかどうかを判断させます。

(40)

未完了と完了

./views/index.haml

%ul

- find_all.each do |document| %li

- if document['status']

%s= document['name']

|

%a{href: "/delete/#{document['_id']}"} 削除 - else

= document['name']

|

%a{href: "/done/#{document['_id']}"} 完了 |

%a{href: "/update/#{document['_id']}"} 更新 |

(41)

未完了と完了

= document['status'].class.to_s #=> NilClass

nil(空白)が返ってくるのでエラーに ならない

(42)

未完了と完了

ルーティング

get '/done/:id' do |id|

id = BSON::ObjectId.from_string(id) settings.db['sinatraDB'].update( {_id: id},

{ "$set" => {status: Time.now} } )

redirect '/' end

(43)

以上

今回はとても単純なToDoリストを 作成してみました 次回以降はAjaxを絡めて、もっと 高機能なアプリケーションを作成し ましょう

参照

関連したドキュメント

「今夜の夕飯は何にしようか?」と考え

世界的流行である以上、何をもって感染終息と判断するのか、現時点では予測がつかないと思われます。時限的、特例的措置とされても、かなりの長期間にわたり

たとえば、市町村の計画冊子に載せられているアンケート内容をみると、 「朝食を摂っています か 」 「睡眠時間は十分とっていますか」

Frauwallner [1937:287] は下す( Kataoka (forthcoming1) 参照).本質において両者に意見の相違は ないと言うのである( Frauwallner [1937:280, n.1]

自発的な文の生成の場合には、何らかの方法で numeration formation が 行われて、Lexicon の中の語彙から numeration

[r]

基準の電力は,原則として次のいずれかを基準として決定するも

学側からより、たくさんの情報 提供してほしいなあと感じて います。講議 まま に関して、うるさ すぎる学生、講議 まま