rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

ruby sinatra

2021 May 30.
2021 Feb. 14.
2020 Nov. 07.
2018 Nov. 04.
2018 Oct. 08.
2018 Apr. 21.

sinatraインストール

sinatraはBundlerでインストールできるので、このセクションは無視して下の「sinatraインストールに先立ってプロジェクト初期化」から始めればよい)

(Rbenv、Bundlerがシステムワイドにインストールされた環境にて)

# rbenv exec gem install sinatra
# rbenv rehash

## sinatra-reloaderを利用するためにsinatra-contribをインストールする
##(システムワイドにインストール)
# rbenv exec gem install sinatra-contrib
# rbenv rehash

## gemをプロジェクトワイドではなくシステムワイドで利用する設定
# su - USER
$ cat ~/.bundle/config
BUNDLE_DISABLE_SHARED_GEMS: "false"


sinatraインストールに先立ってプロジェクト初期化

$ mkdir PROJECT
$ cd PROJECT


gemをシステムワイドにインストールせず、プロジェクト毎にインスール場合は下の「プロジェクトを初期化」に進む
gemをシステムワイドにインストールする場合はその設定を行う

(システムワイドでは実行時にファイル属性エラーが出るので、gemをシステムワイドにインストールせず、プロジェクト毎にインスールした)

gemをシステムワイドにインストールする設定
  BUNDLE_DISABLE_SHARED_GEMS: '0'
  を次のいずれかの場所に設定する。
   ・ ~/.bundle/config // ユーザーワイドに設定
   ・ PROJECT/.bundle/config // プロジェクト毎に設定ファイルで設定

プロジェクトを初期化
$ cd PROJECT
$ rbenv exec bundle init

利用するgemを記述
$ vim Gemfile
    gem 'sinatra'
    gem "sinatra-reloader"
    gem 'webrick'
      # ruby 3.0以降ではwebrickが付属しないので、gemとして別途インストールする

gemインストール

(システムワイドでは実行時にファイル属性エラーが出るのでプロジェクト毎にgemをインスールした)

## システムワイドにgemをインストールする場合
$ cd PROJECT
$ rbenv exec bundle install

## プロジェクト毎にgemをインストールする場合
$ cd PROJECT
$ rbenv exec bundle install --path vendor/bundle


port開放

デフォルトで4567ポートを利用する

# ufw enable

## LAN内ホストからのアクセス許可
# ufw allow proto tcp from 192.168.1.0/24 to any port 4567
# ufw allow proto udp from 192.168.1.0/24 to any port 4567

## OpenVPNクライアントからのアクセス許可
# ufw allow proto tcp from 10.8.0.0/24 to any port 4567
# ufw allow proto udp from 10.8.0.0/24 to any port 4567

# ufw reload

アプリ構成

・ プロジェクトディレクトリ直下にメインのrubyスクリプトを置く。

・ プロジェクトディレクトリ直下にpublic, viewsの2ディレクトリを作成する。

publicディレクト
静的ファイル(html, css, jsなど)・表示するだけのファイル(画像、cssなど)を置くためのディレクトリ。
public内のファイルは公開URLのルートディレクトリ直下にマッピングされる。

viewsディレクト
テンプレートファイルを管理しておくディレクトリ。
rubyコードとHTMLコードを分離し、HTMLコードはviewsディレクトリに置く。
rubyプログラムを埋め込んでHTMLを記述したerbなどはviewsディレクトリに置く。


動作の仕組み、おおまかな使い方

プロジェクトディレクトリ直下のメインのrubyスクリプト(最初に起動するrubyスクリプト)の書き方
class MyApp < Sinatra::Base
    # デフォルトではローカルホストからのアクセスしか受け付けない設定をどのアドレスからでもアクセス可能とする
    set :bind, '0.0.0.0'

    # encoding: utf-8
    DIRSEPARATOR = File::ALT_SEPARATOR || File::SEPARATOR

    # enable sessions
    set :sessions,
    secret: 'mySecretKeyIsHere'

    # escape_htmlメソッドをhというalias名称にして使う
    # <%= h VARIABLE %>  HTML にはそのまま書けない文字を実体参照に置き換え。HTML の「&“<>」をエスケープ
    helpers do
      # define method "h" to escape HTML
      include Rack::Utils; alias_method :h, :escape_html
   end

    # root URL( IP-ADDRESS:4567/ )へのアクセス時にindex.erbを開く
    get '/' do
      erb :index
    end

    # root-URL/mypage へのアクセス時にindex_mypage.erbを開く
    get '/mypage' do
      erb :index_mypage
    end
end

params[ ]ハッシュ

formからの送られてくる変数はparams[:VAR]で取得できる。

ルーティングのパターンに名前付きパラメータを含めると、 paramsハッシュで取得できる。
get '/mypage/:hoge' do
"Hello #{params['hoge']}!"
end

プロジェクト公開

$ bundle exec ruby ./app.rb -e production


公開アプリ利用

httpで4567ポートにアクセスする。
 http://IP.ADDRESS:4567

ERBの記法

<%= code %> codeを実行して、結果を埋め込む
<% code %> codeを実行するだけ、結果は埋め込まない
<%= h VARIABLE %> HTML にはそのまま書けない文字を実体参照に置き換え。HTML の「&“<>」をエスケープ

変数の受け渡し
受け取ったパラメーターをテンプレート(index.erb)内の変数にするには@nameなどに代入する。
@name = params[:name]

rubyスクリプト内で@を付けた変数は、呼び出された.erbファイル内でも利用できる。

if文の記述
<% if line =~ /#{@searchWord}/ then %>
<%= line %>
<% end %>