SlideShare a Scribd company logo
ちっちゃくはじめて
おっきく育てる
sinataraアプリの作り方
SEO Naotoshi (@sonots)
自己紹介
describe Sonots do
its(:company) { should == :DeNA }
it_should_behave_like “DeNA employee”
end
shared_examples_for “DeNA employee” do
it { should write(:perl) } #=> fail
end
最近やってること
Haikanko
※ このロゴはフィクションであり(ry
誰かが言ってた
sinatraってアプリが小さ
い時はいいけど、大きく
なるとお辛いんでしょう?
そんなこと
ないよ
ちっちゃくはじめておっきく
育てる
俺の最強 Sinatra パターン
をお伝えします
ところで
ruby 2.0 で何の問題もな
く動いているので、ruby
2.0関連の話は何もなし...
さっそく
コード中心で><
基礎 ∼ クラシックスタイル
require 'sinatra'
 
get '/hello' do
'Hello World!'
end
 
get '/hello/:name' do
"Hello #{params[:name]}!"
end
$ ruby my_app.rb Gemfile
Gemfile.lock
my_app.rb
起動 ディレクトリ構造
my_app.rb
モジュラースタイル
require 'sinatra/base' 
class MyApp < Siantra::Base
get '/hello' do
'Hello World!'
end
 
get '/hello/:name' do
"Hello #{params[:name]}!"
end
end
$ rackup
Gemfile
Gemfile.lock
config.ru
my_app.rb
起動 ディレクトリ構造
# config.ru
require './my_app'
run MyApp
Controller
足したい
1. Sinatra.register を使う
# my_app.rb
require 'sinatra/base'
require_relative
'posts_controller'
class MyApp < Sinatra::Base
  register PostsController
  get '/hello' do
    'Hello World!'
  end
  
  get '/hello/:name' do
    "Hello #{params[:name]}!"
  end
end Gemfile
Gemfile.lock
config.ru
my_app.rb
posts_controller.rb
ディレクトリ
# posts_controller.rb
module PostsController
  def self.registered(app)
    app.get '/posts' do
    end
    app.get '/posts/:id' do
      "Post #{params[:id]}"
    end
  end
end
app.get とかキモい
2. use (Rack Middleware)
# my_app.rb
class MyApp < Sinatra::Base
  get '/hello' do
    'Hello World!'
  end
  
  get '/hello/:name' do
    "Hello #{params[:name]}!"
  end
end
Gemfile
Gemfile.lock
config.ru
my_app.rb
posts_controller.rb
ディレクトリ
# posts_controller.rb
class PostsController <
Sinatra::Base
  get '/posts' do
  end
  get '/posts/:id' do
    "Post #{params[:id]}"
  end
end
# config.ru
require 'sinatra/base'
require './my_app'
require './posts_controller'
use PostsController
run MyApp
まぁまぁ
本命: URLMap を使う
class HelloController <
Sinatra::Base
  get '/hello' do
    'Hello World!'
  end
  
  get '/hello/:name' do
    "Hello #{params[:name]}!"
  end
end
Gemfile
Gemfile.lock
config.ru
hello_controller.rb
posts_controller.rb
ディレクトリ
class PostsController <
Sinatra::Base
  get '/' do
  end
  get '/:id' do
    "Post #{params[:id]}"
  end
end
require 'sinatra/base'
require './hello_controller'
require './posts_controller'
ROUTES = {
  '/' => HelloController,
  '/posts' => PostsController,
}
run Rack::URLMap.new(ROUTES)
config.ru
View
足したい
View ∼ Sinatraにあるよ
class HelloController < Sinatra::Base
  set :views, File.expand_path('../views', File.dirname(__FILE__))
  
  get '/hello' do
    'Hello World!'
  end
  get '/hello/:name' do
    @name = params[:name]
    erb :hello
  end
end
Gemfile
Gemfile.lock
config.ru
controllers/
views/
ディレクトリ
<html>
  <b>Hello <%= @name %>!</b>
</html>
views/hello.erb
Model
足したい
Model ∼ ActiveRecordとか
source 'https://rubygems.org'
gem 'sinatra', require: 'sinatra/base'
gem 'activesupport'
gem 'activerecord'
gem 'sinatra-activerecord',:require => 'sinatra/activerecord'
gem 'sqlite3'
gem 'rake'
require 'active_record'
ActiveRecord::Base.establish_connection(
  :adapter => 'sqlite3',
  :host => 'localhost',
  :username => 'USERNAME', #or root
  :password => 'PASSWORD',
  :database => 'db/YOURDATABASE'
)
class Post < ActiveRecord::Base
end
models/post.rb
Gemfile
Gemfile
Gemfile.lock
config.ru
controllers/
views/
models/
ディレクトリ
MVC
った ^^
けど
Worker
欲しくなった
Worker
+ gem 'foreman’
ディレクトリ
web: bundle exec rackup web/config.ru
worker: bundle exec ruby worker/notification.rb
worker/notification.rb
Gemfile
Gemfile
Gemfile.lock
config.ru
web/
controllers/
views/
models/
worker/
require_relative '../models/post.rb'
class Notification
  def run
    while true
      sleep 1
      puts "hey! #{Post.all.first}"
    end
  end
end
Notification.new.run
Procfile
$ foreman start
起動
まとめ
• 最初はちっちゃくリーンスタートアップ
• おっきくなっても破綻しない!(Rails っぽくし
ていけば)
• いつ Sinatra やるの?今でしょ!
• コード https://github.com/sonots/sinatra-practice

More Related Content

PDF
LR parsing
PDF
【Unity道場】ゲーム制作に使う数学を学習しよう
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
PDF
Play with UEFI
PDF
C++ Template Meta Programming の紹介@社内勉強会
PPTX
C言語ポインタ講座 (Lecture of Pointer in C)
PPTX
H2O Waveを使ったAIアプリケーション作成入門
PDF
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲
LR parsing
【Unity道場】ゲーム制作に使う数学を学習しよう
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Play with UEFI
C++ Template Meta Programming の紹介@社内勉強会
C言語ポインタ講座 (Lecture of Pointer in C)
H2O Waveを使ったAIアプリケーション作成入門
【アシアル塾】PHPオブジェクト指向再入門・第二回クラスの継承と委譲

What's hot (20)

PDF
ELFの動的リンク
PPTX
Dakota+openFoam1
PDF
いまどき(これから)のPHP開発
PDF
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
PDF
ソフトウェア技術者から見たFPGAの魅力と可能性
PDF
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
PDF
.NET 7期待の新機能
PDF
CRC-32
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
ペアプログラミング ホントのところ
PDF
SAT/SMTソルバの仕組み
PPTX
Unreal engine4を使ったVRコンテンツ製作で 120%役に立つtips集+GDC情報をご紹介
PDF
条件分岐とcmovとmaxps
PDF
Sna Company Profile
PPTX
ゲームエンジニアのためのデータベース設計
PPTX
「機械学習:技術的負債の高利子クレジットカード」のまとめ
PPTX
async/await のしくみ
PDF
[GTMF2019] Python / BlueprintによるUnreal Engineの自動化
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
ELFの動的リンク
Dakota+openFoam1
いまどき(これから)のPHP開発
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
ソフトウェア技術者から見たFPGAの魅力と可能性
Railsアプリのモジュールはどこに置くべきか問題 (公開版)
.NET 7期待の新機能
CRC-32
今日からできる!簡単 .NET 高速化 Tips
ペアプログラミング ホントのところ
SAT/SMTソルバの仕組み
Unreal engine4を使ったVRコンテンツ製作で 120%役に立つtips集+GDC情報をご紹介
条件分岐とcmovとmaxps
Sna Company Profile
ゲームエンジニアのためのデータベース設計
「機械学習:技術的負債の高利子クレジットカード」のまとめ
async/await のしくみ
[GTMF2019] Python / BlueprintによるUnreal Engineの自動化
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Ad

Viewers also liked (8)

PDF
インフラエンジニアは死んだ Yapc -asia 2014
PDF
初めてのPadrino
PDF
Accept-language
PDF
My sql casual talks vol.6
PDF
Railsチュートリアルの歩き方 (第3版)
PDF
Unbreakable VPN using Vyatta/VyOS - HOW TO -
PDF
データベース技術の羅針盤
PDF
Railsチュートリアルの歩き方 (第4版)
インフラエンジニアは死んだ Yapc -asia 2014
初めてのPadrino
Accept-language
My sql casual talks vol.6
Railsチュートリアルの歩き方 (第3版)
Unbreakable VPN using Vyatta/VyOS - HOW TO -
データベース技術の羅針盤
Railsチュートリアルの歩き方 (第4版)
Ad

More from Naotoshi Seo (14)

PDF
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
PDF
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
PDF
Mobage を支える Ruby の技術 ~ 複数DB編 ~
PDF
Fluentd Hacking Guide at RubyKaigi 2014
PDF
InfluxDB の概要 - sonots #tokyoinfluxdb
PDF
Serf という Orchestration ツール #immutableinfra
PDF
Shadow Server on Fluentd at Fluentd Casual Talks #3
PDF
Is ruby logger thread(process)-safe? at RubyConf 2013
PDF
Yohoushi
PDF
Haikanko rubykaigi 20130531
PDF
Mina 20130417
PDF
Fluentdcasual 02-haikanko
PDF
capistrano-colorized-stream
PDF
Ruby test double
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
HTTP/2 でリバプロするだけでグラフツールを 高速化できた話
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Fluentd Hacking Guide at RubyKaigi 2014
InfluxDB の概要 - sonots #tokyoinfluxdb
Serf という Orchestration ツール #immutableinfra
Shadow Server on Fluentd at Fluentd Casual Talks #3
Is ruby logger thread(process)-safe? at RubyConf 2013
Yohoushi
Haikanko rubykaigi 20130531
Mina 20130417
Fluentdcasual 02-haikanko
capistrano-colorized-stream
Ruby test double

Sinatra Pattern 20130415