メモ書き

sinatra

rubyで記述されたWebアプリケーションフレームワーク かならずしもMVCで記述する必要がなく非常に軽快に Webアプリケーションを作成することが出来ます。

sinatra のコード例

 # -*- coding: utf-8 -*-
 require 'sinatra'

 get '/example' do
    @title = 'example'
    @view = Model.action()
    erb :example
 end

Wikipediaの記述

以下のようにURIのルーティングを記述することで 処理を記載していくことが出来ます。

Hello World 的なもの

 get '/hello' do
    "ハローワールド"
 end

上記の実行例

sinatra では、テンプレートを使ってViewを分離することも可能

テンプレートは共通のレイアウト定義(defaultでは、layout.erb)と 個別のレイアウト定義を分けて記述することが出来ます。

テンプレート使うコード

 get '/template' do
   @title = "テンプレートテスト"
   @var = "ここが変更されます。"
   erb :template
 end

共通レイアウト (layout.erb)

 <!DOCTYPE html>
 <html lang="ja">
 <head>
     <meta charset="utf-8">
     <title><%= @title %></title>
 </head>
 <body>
     <%= yield %>
 </body>
 </html>

テンプレート部分 (template.erb)

 <h1> 下に処理内で指定した文字列が出力される </h1>
 <p> <%= @var %> </p>

上記の実行例

テンプレートには処理を埋め込めるので、以下の用に実処理と描画用の 処理を分けることが出来ます。

(要は、テンプレートにViewの処理を埋め込めることが出来る)

処理側ではリストの用意まで行なう

 get '/list' do
   @title = "リスト表示のテスト"
   @list = ['AAA', 'BBB', 'CCC']
   erb :list_test
 end

テンプレート部分(list_test.erb)

 <h3> 以下の用に表示側の都合で処理を選べる </h3>

 点付きリストにするか
 <ul>
   <% @list.each do |item| %>
   <li> <%= item %> </li>
   <% end %>
 </ul>

 番号付きリストにするか
 <ol>
   <% @list.each do |item| %>
   <li> <%= item %> </li>
   <% end %>
 </ol>

 View側で選ぶので、処理とデザインを分けれる。

上記の実行例

テンプレートには上記のerb形式の他に色々なフォーマットが利用できます。 以下は対応しているテンプレートのフォーマットです。

他にもあります。

ちなみにこのページは Markdown で記述したものを sinatra で 呼び出しています。

sinatra は、ルーティングの指定に柔軟性があったり、 他にもいろいろ機能はあります。

See: [日本語のReadMe] http://sinatrarb.com/intro-ja.html

ActiveRecord

Ruby on Rails で利用されているデータベースアプローチの仕組みです。

ActiveRecord の強みはDBへのアクセスを直感的なインスタンス アクセスで行なえるところです。

たとえば、以下のようなカラム構成のpartsというテーブルを 利用する場合

カラム名 概要
name 名前
price 値段

以下のようにクラス宣言すればそのクラスやインスタンスに アクセスすることでDBアクセスを行えるようになります。

 class Part < ActiveRecord::Base
 end

例えば、新規にレコードを追加する場合は以下のように新たに インスタンスを生成する体で使うことが出来ます。

  a = Part.new
  a.name = "Sample part"
  a.price = 123.45
  a.save

上記の手順でSQL文の INSERT文と同じことになります。

DBからの探索をおこなうのであれば以下のようにクラスメソッドを 呼び出す体で行なうことが出来るのでDBを意識する必要がないです。

下記のように記述すれば parts テーブルから name カラムの値が Apple であるレコードの最初の1件が取得できます。

 b = Part.find_by(name: "Apple")

下記のように記述すれば parts テーブルから name カラムの値が Apple であるレコードの全てが配列で取得できます。

 b = Part.where(name: "Apple")

また、上記で取得したレコードの内容は以下のようにカラム名を メンバ名に指定することでアクセス出来ます。

 b.each do |i|
   print "name=#{i.name}, price=#{i.price}"
 end

更新をするのも以下のようにインスタンスへの変更を行うことで 実現しています。

 b.each do |i|
   i.price *= 1.08 # 税込み価格に変更
   i.save # 更新を適用
 end

これらを使って現在作っているWebアプリ

実装ソース例