ibm i - 2014 powerruby 入門 1.0 2014 -12 19 ver. · ruby on rails web...
TRANSCRIPT
Ver.
オープンソース協議会 IBM i - 2014 勉強会
PowerRuby 入門 2014-12-19 1.0
ティアンドトラスト株式会社 北原 征夫
+ =
はじめに
PHP に代わるのではなく、選択肢の広がり
Java, Perl, PHP, Ruby, Node.js …
TIOBE Index for November 2014 http://www.tiobe.com
トップ15 Apple :1 MS :5 Linux :9
Linux と比較すると
IBM i は 8 言語 の利用が可能
1
PowerRuby 概説
2
PowerRuby 概説
ruby
日本人が開発(まつもとゆきひろ氏)
1993 開発開始
オープンソース
インタープリター
Windows, Linux, Unix, Mac
<> php
完全オブジェクト指向
アプリケーション, GUI, iOS, 組み込み
グルー言語
3
PowerRuby 概説
ruby on rails
Web アプリケーションフレームワーク
オープンソース
MVC
同じ事を繰り返さない:DRY ( Don’t Repeat Your self )
設定より規約:CoC ( Conversion Over Configuration)
Scaffold
4
PowerRuby 概説
PowerRuby
米国 PowerRuby.com http://powerruby.com
IBM i で稼働する Ruby, Rails を提供
IBM i は DB を OS に統合した強力なプラットフォーム
APサーバーとDBサーバーを分離しなくて良い
無償のコミュニティーバージョンを提供
ibm_db
IBM DB2 for i へのネイティブアクセス
RubyForge でオープンソースとして開発
IBM の支援
XMLSERVICE (XMLTOOLKIT)
IBM i 資産(RPG, オブジェクト)の利用
IBM → YiPs でオープンソースとして開発
5
PowerRuby 概説
PowerRuby 導入の要件
IBM i : V7R1M0
QCCSID : 5035 or 1399
必須ライセンス
5770-SC1 *BASE IBM Portable Utilities for i
5770-SC1 OPT1 OpenSSH, OpenSSL, zlib
5770-SS1 OPT33 PASE
5770-DG1 *BASE IBM HTTP Server for i
6
PowerRuby 概説
プロダクト・ライブラリー
POWER_RUBY
利用可能なバージョン(※2014-12-13 現在)
OPT2 : Ruby 2.0.0, rails 4.0.12
OPT3 : Ruby 2.1.5, rails 4.1.8
バージョンの切り替え
SETPOWRBY
XMLService
1.9.1 (1.3.0 GA5 gem)
7
PowerRuby 導入
PowerRuby の導入手順
8
PowerRuby 導入
PowerRuby 導入
1. ダウンロード
① http://powerruby.com
② Download をクリック
③ 要ユーザー登録
④ ダウンロードリンクが記載されたメールが届く
⑤ power_ruby_current.tar.bz2 をダウンロードし解凍
⑥ 保管ファイル(SAVF)で提供 (※2014-12-13 現在 v1.0.7)
PRUBY_BASE.SAVF, PRUBY_0002.SAVF, PRUBY_0003.SAVF
9
Hello masao kitahara, Before installing PowerRuby make sure to read the disclaimer and warranty. You can download PowerRuby from the following URL: http://powerruby.com/releases/power_ruby_current.tar.bz2 Click here for install and update instructions. Once installed, click here for how to setup your first RubyOnRails app! Please direct all questions to [email protected]. We'd also love to hear from you concerning your interest. Have you used RubyOnRails before and are considering it for IBM i? Are you interested at a hobby level? Thanks,
PowerRuby 導入
PowerRuby 導入
2. *.savf を IBM i へ
① 保管ファイルを IBM i に作成
② FTP で BIN(バイナリーモード)で送信
3. インストール
10
CRTSAVF FILE(QGPL/PRUBY_BASE) CRTSAVF FILE(QGPL/PRUBY_0002) CRTSAVF FILE(QGPL/PRUBY_0003)
RSTLICPGM LICPGM(1PRUBY1) DEV(*SAVF) LNG(2924) SAVF(QGPL/PRUBY_BASE) RSTLICPGM LICPGM(1PRUBY1) DEV(*SAVF) LNG(2924) OPTION(2) SAVF(QGPL/PRUBY_0002) RSTLICPGM LICPGM(1PRUBY1) DEV(*SAVF) LNG(2924) OPTION(3) SAVF(QGPL/PRUBY_0003)
PowerRuby 導入
PowerRuby 導入
4. ライセンス導入の確認
① DSPSFWRSC
11
資源 ID オプション 機能 記述 1PRUBY1 *BASE 5001 IBM i PowerRuby (administration utilities) 1PRUBY1 *BASE 2924 IBM i PowerRuby (administration utilities) 1PRUBY1 2 5001 IBM i PowerRuby (Ruby 2.0 + Rails 4.0) 1PRUBY1 3 5001 IBM i PowerRuby (Ruby 2.1 + Rails 4.1)
PowerRuby 導入
PowerRuby 導入
5. バージョン確認1
① ADDLIBLE LIB(POWER_RUBY)
② SETPOWRBY VRM(*V20)
③ CALL PGM(QP2TERM)
12
> ruby -v ruby 2.0.0p598 (2014-11-13 revision 48408) [powerpc-aix6.1.0.0] # > rails -v Rails 4.0.12 #
PowerRuby 導入
PowerRuby 導入
6. バージョン確認2
① ADDLIBLE LIB(POWER_RUBY)
② SETPOWRBY VRM(*V21)
③ CALL PGM(QP2TERM)
13
> ruby -v ruby 2.1.5p273 (2014-11-13 revision 48405) [powerpc-aix6.1] # > rails -v Rails 4.1.8 #
PowerRuby 導入(参考)
ruby 1.9.3 + rails 3.2.18
PowerRuby v1.0.2 に同梱
最新版には同梱されない
OPT1として提供(PRUBY_0001.SAVF)
インストール方法は OPT2, OPT3 と同様
SETPOWRBY VRM(*V19)
2015年2月でサポート終了(ruby)
14
> ruby -v ruby 1.9.3p547 (2014-05-14 revision 45962) [powerpc-aix6.1.0.0] # > rails -v Rails 3.2.18 #
ハンズオンの解説
ハンズオンの解説
15
ハンズオン解説
資料は OSS 協議会よりダウンロード
オープンソース協議会のサイトよりダウンロード
http://i5php.jp/
zip ファイルがダウンロードできます
「RubyでIBM-i-新規アプリケーションを作ってみよう!.zip」
16
ハンズオン解説
収録内容
テキスト
【概説】RubyでIBM i 新規アプリケーションを….pdf
PowerRuby のインストール方法など
【実習】RubyでIBM i 新規アプリケーションを….pdf
ハンズオンの資料
リソース
IBM i がインターネットで利用できない場合以下を使用
will_paginate-3.0.7.gem
will_paginate のローカル導入方法.txt
スタイルの指定
will_paginate.css
postslist.css
17
ハンズオン解説
必要なもの
IBM i ネットサーバーを有効にする
5250エミュレーター
CL コマンドライン
QP2TERM or QSHELL
メモ帳
18
ハンズオン概要
ハンズオン1
データベースの CRUD アプリケーションの作成
ハンズオン2
プラグインの使用
ハンズオン3
スタイルの変更
19
ハンズオン1
ハンズオン1を題材に解説
20
ハンズオン1のフロー
ハンズオン1
I. サーバーの構築
II. テーブルの作成
III. アプリケーションの作成
IV. ルーティングの設定
V. 動作確認
21
Ⅰ. サーバーの構築
22
構築されるサーバーのイメージ
サーバーの構築
23
(thin) (IHS)
サーバーの構築
アプリケーションの作成
rails はアプリケーションの雛型作成から始まる
雛型作成時にサーバーも作成される
PowerRuby のアプリケーション作成方法
24
RAILSNEW
他のプラットフォームの場合
rails new <アプリケーション名>
サーバーの構築
RAILSNEW CL コマンド
VRM :バージョンの指定
*V19
*V20
*V21
RAILSAPP :アプリケーション名
DBUSR :新規 IBM i ユーザープロファイル
DBPASS :パスワード
DBROOT :ライブラリー名のプリフィックス
HTTPSRV :サーバー名
25
サーバーの構築
RAILSNEW CL コマンド
EXTPATH :Web サーバーの httpd.conf のパス
'' :デフォルトの httpd.conf を使用する場合
EXTPORT :Web サーバー のサーバーポート
INTPATH :RAILS の httpd.conf のパス
'' :デフォルトの httpd.conf を使用する場合
INTPORT :RAILS のサーバーポート
ENV :作成時の環境
開発用(*DEVELOPMENT)
テスト用(*TEST)
製品用(*PRODUCTION)
26
サーバーの構築
RAILSNEW CL コマンド
PLACE :Webサーバーの作成場所
*HOME :/home/<ユーザープロファイル>/
*WWW :/www/
WEBCON :ブラウザ経由の irb の設定
PID :PIDファイルの名前
LIB :POWER_RUBY ライブラリー名
MSGQ :*MSGQ 名
27
構築されるサーバーのイメージ
サーバーの構築
28
(thin) (IHS)
例) RAILSNEW VRM(*V20) RAILSAPP(APPNAME) DBUSR(APUSER) DBPASS(APPASS) DBROOT(APLIB) HTTPSRV(APSVR) EXTPATH('') EXTPORT(2222) INTPATH('') INTPORT(2202) PLACE(*WWW)
[IHS サーバー (HTTPSRV)] /www/APSVR [config (EXTPATH)] /www/APSVR/conf/httpd.conf [ポート (EXTPORT)] 2222
[環境 (VRM)] Ruby:2.0.0 Rails :4.0.12 [PLACE] [RAILS サーバー (RAILSAPP)] /www/APSVR/htdocs/APNAME [config (INTPATH)] /www/APSVR/htdocs/APNAME/config/apache.conf [ポート (INTPORT)] 2202
[DBROOT] APLIB_D
[DBROOT] APLIB_P
[DBROOT] APLIB_T
[各ライブラリーのオブジェクト] ジャーナル (*JRN) ジャーナルレシーバー (*JRNRCV) SQLコレクションビュー (*FILE LF)
サーバーの起動/停止1
Web サーバー:IHS(IBM HTTP Server)
起動:STRTCPSVR CL コマンド
停止:ENDTCPSVR CL コマンド
29
STRTCPSVR SERVER(*HTTP) HTTPSVR(<インスタンス名>)
ENDTCPSVR SERVER(*HTTP) HTTPSVR(<インスタンス名>)
(thin) (IHS)
例)インスタンス名:APSVR STRTCPSVR SERVER(*HTTP) HTTPSVR(APSVR) ENDTCPSVR SERVER(*HTTP) HTTPSVR(APSVR)
サーバーの起動/停止2
Rails サーバー:thin Server
起動/停止:RAILSVR CL コマンド
30
RAILSSVR
※ 注意:ジョブ名が変わってしまう RAILSNEW で作成した直後、Rails サーバーのジョブ名 :RAILSSRV RAILSSVR で再起動後、Rails サーバーのジョブ名 :RAILASVR
サーバーの起動/停止2
RAILSSVR CL コマンド
ACTION :開始、終了の指定
*START
*END
APP :アプリケーションのフルパス
VRM :バージョンの指定
*V19
*V20
*V21
PORT :RAILS のサーバーポート
31
サーバーの起動/停止2
RAILSSVR CL コマンド
ENV :実行時の環境
開発用(*DEVELOPMENT)
テスト用(*TEST)
製品用(*PRODUCTION)
HOST :RAILS サーバーの IP アドレス
PID :PID ファイルの名前
32
(thin) (IHS)
例)アプリケーション名:/www/APSVR/htdocs/APNAME RAILSSVR ACTION(*START) APP('/www/APSVR/htdocs/APNAME') VRM(*V20) PORT(2202) RAILSSVR ACTION(*END) APP('/www/APSVR/htdocs/APNAME')
サーバー・ジョブの確認
Web サーバー
WRKACTJOB CL コマンド
33
WRKACTJOB JOB(<インスタンス名>)
現行 サブシステム/ジョブ ユーザー タイプ CPU % 機能 状況 APSVR QTMHHTTP BCH .0 PGM-QZHBMAIN SIGW APSVR QTMHHTTP BCI .0 PGM-QZSRLOG SIGW APSVR QTMHHTTP BCI .0 PGM-QZSRHTTP SIGW APSVR QTMHHTTP BCI .0 PGM-QZSRHTTP DEQW
例)インスタンス名:APSVR WRKACTJOB JOB(APSVR)
サーバー・ジョブの確認
Rails サーバー
WRKACTJOB CL コマンド
ジョブログの表示:OPT5 → 10. ジョブ・ログ表示
34
WRKACTJOB JOB(RAILSSVR) OR WRKACTJOB JOB(RAILSSRV)
現行 サブシステム/ジョブ ユーザー タイプ CPU % 機能 状況 RAILSSVR QSECOFR BCH .0 PGM-ruby SELW
例)アプリケーション名:APNAME WRKACTJOB JOB(RAILSSVR)
ジョブ・ログ表示 POWER_RUBY/RAILSSVR ACTION(*END) APP('/www/APSVR/htdocs/APNAME') PID('server')
作成されるディレクトリの構成
Rails ディレクトリ構造(抜粋)
例)APNAME アプリケーションを *WWW で作成
35
/www/APSVR/htdocs/APNAME/ ... アプリケーション・ルート
- app/
- assets/ css, js などを配置する
- controllers/ コントローラーを配置する
- models/ モデルを配置する
- views/ ビューを配置する
- config/ ルーティング用の route.rb を配置する
- db/ マイグレーションスクリプトを配置する
- log/ ログが記録される
- public/ 静的コンテンツを配置する
- Gemfile bundler 対象の Gem パッケージを記述する
Ⅱ. テーブルの作成
36
モデルの作成1
モデルの規約
Rails MVC の中でデータベースの処理を担当する
app/models に作成
ファイルのエンコードは UTF-8 とする
ファイル名は snake case で表記
単語は全て小文字、単語の区切りは _ ... snake_case
例)model.rb
クラスとして定義
クラス名はモデル名に合わせる
クラス名は Camel Case で表記
単語の区切りは大文字 ... CamelCase
例)Model
37
モデルの作成1
モデルの規約
基本的に 1 クラス 1 テーブルの処理
O/R マッパーの ActiveRecord::Base を継承
オブジェクト構造とテーブル構造を関連付け、利用する
CRUD(create,read,update,delete) 操作に必要な メソッドが提供される
...
38
モデルの作成2
generate model
rails の “generate model” で作成
PASE コマンド
アプリケーション・ルートをカレントにして実行
フィールド名や型を同時に指定可能
モデルの規約に則り作成される
テーブル作成用の マイグレーション・スクリプト作成
39
rails generate model モデル名 フィールド名1:データ型 ...
例)title, body フィールドを持つ Post テーブルのモデルを作成 > cd /www/APSVR/htdocs/APNAME > rails generate model Post title:string body:text
モデルの作成3
モデル作成の実行
1. QP2TERM を起動
2. cd アプリケーション・ルート
3. rails generate model ...
40
/QOpenSys/usr/bin/-sh > cd /www/APSVR/htdocs/APNAME # > rails generate model Post title:string body:text [1m [37m invoke [0m active_record [1m [32m create [0m db/migrate/20141215120206_create_posts.rb [1m [32m create [0m app/models/post.rb [1m [37m invoke [0m test_unit [1m [32m create [0m test/models/post_test.rb [1m [32m create [0m test/fixtures/posts.yml #
モデルの作成4
作成されたモデル
app/models/post.rb
41
class Post < ActiveRecord::Base end
01 02
テーブルの作成1
マイグレーション・スクリプトから作成
テーブルを SQL 等で直接作成しない
マイグレーション・スクリプトを使用する
スクリプトは db/migrate に作成される
ruby のビルドツール rake を使用
アプリケーション・ルートをカレントにして実行
利点
テーブルに関する処理を記録、ロールバック
別の環境でも同じものが作成できる
データベースの種類に依存しない
42
rake db:migrate
テーブルの作成2
作成された マイグレーション・スクリプト
db/migrate/20141215120206_create_posts.rb
命名規則:<タイムスタンプ>_create_<モデル名>.rb
43
class CreatePosts < ActiveRecord::Migration def change create_table :posts do |t| t.string :title t.text :body t.timestamps end end end
01 02 03 04 05 06 07 08 09
テーブルの作成3
テーブル作成の実行
1. QP2TERM を起動
2. cd アプリケーション・ルート
3. rake db:migrate
44
/QOpenSys/usr/bin/-sh > cd /www/APSVR/htdocs/APNAME # > rake db:migrate == 20141215120206 CreatePosts: migrating ================== -- create_table(:posts) -> 0.8807s == 20141215120206 CreatePosts: migrated (0.8809s) ============ #
テーブルの確認1
作成されたテーブルの確認:DSPFD
指定された ENV ライブラリーに作成
例)ENV(*DEVELOPMENT) → APNAME_D (*LIB)
通常の物理ファイル (*FILE PF-DTA)
ファイル名は <モデル名>+S (モデル名の複数形)
ジャーナル済み
IMAGES(*IMMED)
OMTJRNE(*OPNCLO)
メンバーサイズ:*NOMAX
固有キーが必要(UNIQUE):YES
キーフィールド:ID
45
例)DSPFD FILE(APNAME_D/POSTS)
テーブルの確認2
作成されたテーブルの確認:DSPFFD
キーフィールド、作成日時、更新日時 は自動作成
46
ファイル・フィールド記述表示 データ フィールド バッファー バッファー フィールド カラムの フィールド タイプ 長 長 位置 使用法 見出し ID BINARY 9 0 4 1 共用 ID TITLE 混用 255 257 5 共用 TITLE 可変長フィールド -- 割り振られた長さ : なし ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 5035 BODY CLOB 1048576 43 262 共用 BODY キーボード・シフト . . . . . . . . . . . : O 割り振られた長さ . . . . . . . . . . . . : 0 ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 5035 CREATED_AT TIMESTAMP 26 26 305 共用 CREATED_A ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 1027 UPDATED_AT TIMESTAMP 26 26 331 共用 UPDATED_A ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 1027
> rails generate model Post title:string body:text
例)DSPFFD FILE(APNAME_D/POSTS)
172.29.144.105
参考:日本語対応
フィールドの CCSID を UTF-8 に変更
現時点では 5035 の対応が中途半端
SQL の ALTER TABLE
47
例)POSTS 作成した TITLE, BODY フィールドを UTF-8 に変更 ALTER TABLE APLIB_D/POSTS ALTER COLUMN TITLE SET DATA TYPE VARCHAR(255) CCSID(1208) ALTER TABLE APLIB_D/POSTS ALTER COLUMN BODY SET DATA TYPE CLOB CCSID(1208)
ALTER TABLE <ライブラリー名/ファイル名> ALTER COLUMN <フィールド名> SET DATA TYPE <データタイプ(桁数)> CCSID 1208
参考:日本語対応
変更後のテーブルの確認:DSPFFD
48
ファイル・フィールド記述表示 データ フィールド バッファー バッファー フィールド カラムの フィールド タイプ 長 長 位置 使用法 見出し ID BINARY 9 0 4 1 共用 ID TITLE 混用 255 257 5 共用 TITLE 可変長フィールド -- 割り振られた長さ : なし ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 1208 UCS2 またはユニコード変換 . . . . . . . : *CONVERT データの正規化 . . . . . . . . . . . . . : NO BODY CLOB 1048576 43 262 共用 BODY キーボード・シフト . . . . . . . . . . . : O 割り振られた長さ . . . . . . . . . . . . : 0 ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 1208 UCS2 またはユニコード変換 . . . . . . . : *CONVERT データの正規化 . . . . . . . . . . . . . : NO CREATED_AT TIMESTAMP 26 26 305 共用 CREATED_A ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 1027 UPDATED_AT TIMESTAMP 26 26 331 共用 UPDATED_A ヌル値使用可能 コード化文字セット ID. . . . . . . . . : 1027
例)DSPFFD FILE(APNAME_D/POSTS)
Ⅲ. アプリケーションの作成
49
コントローラー, ビューの作成
コントローラーの規約1
Rails MVC の中でモデルと画面の制御を担当する
app/conrollers に作成
ファイルのエンコードは UTF-8 とする
基本的に 1 モデル 1 コントローラーの処理
ファイル名は <コントローラー名>+_controller.rb
ファイル名は snake case で表記
単語は全て小文字、単語の区切りは _ ... snake_case
コントローラー名はモデル名の複数形にする
例)models_controller.rb
50
コントローラー, ビューの作成
コントローラーの規約2
クラスとして定義
クラス名は Camel Case で表記
単語の区切りは大文字 ... CamelCase
例)ModelsController
ApplicationController クラスを継承
複数のアクション・メソッドを持つ
要求に基づいて具体的な処理を実行するメソッド
アクション・メソッドは public 定義(デフォルト)
...
51
コントローラー, ビューの作成
ビューの規約
Rails MVC の中で画面を担当する
app/views に作成
ファイルのエンコードは UTF-8 とする
結果として返される文面をテンプレートとして作成
body タグの間に記述する内容のみ(それ以外は自動付与)
処理した結果のデータを埋め込み表示する
ビューファイル名は アクション名 + .html.erb
アクションから自動で呼び出される
呼び出すためのコーディングは不要
アクションと別名で作成し、明示的な呼び出しも可能
...
52
アプリケーションの作成1
generate scaffold_controller
rails の “generate scaffold_controller” で作成
PASE コマンド
アプリケーション・ルートをカレントにして実行
フィールド名や型を同時に指定可能
コントローラー、ビューを作成
規約に則り作成される
53
rails generate scaffold_controller モデル名 フィールド名1:データ型 ...
例)title, body フィールドを持つ Post テーブルのモデルを作成 > cd /www/APSVR/htdocs/APNAME > rails generate scaffold_controller post title:string body:text
アプリケーションの作成2
コントローラー
scaffold で作成されるアクションメソッド
index :一覧画面の表示
show :詳細画面の表示
new :新規登録画面の表示
edit :編集画面の表示
create :新規登録を処理し、詳細画面を表示
update :更新を処理し、詳細画面を表示
destroy :削除を処理し、一覧画面を表示
54
アプリケーションの作成2
ビュー
scaffold で作成されるディレクトリ
app/views/<モデル名>+s
scaffold で作成されるビュー・ファイル(*.html.erb)
index :一覧画面
show :詳細画面
new :新規登録画面
edit :編集画面
_form :登録、更新用のフォーム (new, edit に埋め込み)
55
アプリケーションの作成2
アプリケーション作成の実行1
1. QP2TERM を起動
2. cd アプリケーション・ルート
3. rails generate scaffold_controller ...
56
アプリケーションの作成2
アプリケーション作成の実行2
57
/QOpenSys/usr/bin/-sh > cd /www/APSVR/htdocs/APNAME # > rails generate scaffold_controller post title:string body:text [1m [32m create [0m app/controllers/posts_controller.rb [1m [37m invoke [0m erb [1m [32m create [0m app/views/posts [1m [32m create [0m app/views/posts/index.html.erb [1m [32m create [0m app/views/posts/edit.html.erb [1m [32m create [0m app/views/posts/show.html.erb [1m [32m create [0m app/views/posts/new.html.erb [1m [32m create [0m app/views/posts/_form.html.erb [1m [37m invoke [0m test_unit [1m [32m create [0m test/controllers/posts_controller_test.rb [1m [37m invoke [0m helper [1m [32m create [0m app/helpers/posts_helper.rb [1m [37m invoke [0m test_unit [1m [32m create [0m test/helpers/posts_helper_test.rb [1m [37m invoke [0m jbuilder [1m [32m create [0m app/views/posts/index.json.jbuilder [1m [32m create [0m app/views/posts/show.json.jbuilder #
アプリケーションの作成3
作成されたコントローラー1
app/controllers/posts_controller.rb
58
class PostsController < ApplicationController before_action :set_post, only: [:show, :edit, :update, :destroy] # GET /posts # GET /posts.json def index @posts = Post.all end # GET /posts/1 # GET /posts/1.json def show end # GET /posts/new def new @post = Post.new end # GET /posts/1/edit def edit end
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
アプリケーションの作成3
作成されたコントローラー2
app/controllers/posts_controller.rb
59
# POST /posts # POST /posts.json def create @post = Post.new(post_params) respond_to do |format| if @post.save format.html { redirect_to @post, notice: 'Post was successfully created. ' } format.json { render action: 'show', status: :created, location: @post } else format.html { render action: 'new' } format.json { render json: @post.errors, status: :unprocessable_entity } end end end
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
アプリケーションの作成3
作成されたコントローラー3
app/controllers/posts_controller.rb
60
# PATCH/PUT /posts/1 # PATCH/PUT /posts/1.json def update respond_to do |format| if @post.update(post_params) format.html { redirect_to @post, notice: 'Post was successfully updated. ' } format.json { head :no_content } else format.html { render action: 'edit' } format.json { render json: @post.errors, status: :unprocessable_entity } end end end
39 40 41 42 43 44 45 46 47 48 49 50 51 52
アプリケーションの作成3
作成されたコントローラー4
app/controllers/posts_controller.rb
61
# DELETE /posts/1 # DELETE /posts/1.json def destroy @post.destroy respond_to do |format| format.html { redirect_to posts_url } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_post @post = Post.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list # through. def post_params params.require(:post).permit(:title, :body) end end
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
アプリケーションの作成4
作成されたビュー1
app/views/posts/index.html.erb
62
<h1>Listing posts</h1> <table> <thead> <tr> <th>Title</th> <th>Body</th> <th></th> <th></th> <th></th> </tr> </thead> <tbody> <% @posts.each do |post| %> <tr> <td><%= post.title %></td> <td><%= post.body %></td> <td><%= link_to 'Show', post %></td> <td><%= link_to 'Edit', edit_post_path(post) %></td> <td> <%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %> </td> </tr> <% end %> </tbody> </table> <br> <%= link_to 'New Post', new_post_path %>
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
アプリケーションの作成4
作成されたビュー2
app/views/posts/show.html.erb
63
<p id="notice"><%= notice %></p> <p> <strong>Title:</strong> <%= @post.title %> </p> <p> <strong>Body:</strong> <%= @post.body %> </p> <%= link_to 'Edit', edit_post_path(@post) %> | <%= link_to 'Back', posts_path %>
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
アプリケーションの作成4
作成されたビュー3
app/views/posts/new.html.erb
64
<h1>New post</h1> <%= render 'form' %> <%= link_to 'Back', posts_path %>
01 02 03 04 05 06
アプリケーションの作成4
作成されたビュー4
app/views/posts/edit.html.erb
65
<h1>Editing post</h1> <%= render 'form' %> <%= link_to 'Show', @post %> | <%= link_to 'Back', posts_path %>
01 02 03 04 05 06 07
アプリケーションの作成4
作成されたビュー5
app/views/posts/_form.html.erb
66
<%= form_for(@post) do |f| %> <% if @post.errors.any? %> <div id="error_explanation"> <h2> <%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved: </h2> <ul> <% @post.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class="field"> <div class="field"> <%= f.label :title %><br> <%= f.text_field :title %> </div> <div class="field"> <%= f.label :body %><br> <%= f.text_area :body %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Ⅳ. ルーティングの設定
67
ルーティング
ルーティングについて
要求とコントローラーのアクションを関連付ける
config/routes.rb に作成
68
routes.rb
controller1
actionA
actionB
controller2
actionA
actionB 例) c1acta の要求は、 controller1 コントローラーの actionB へ
http://~/c1acta
ルーティングの設定1
scaffold_controller で作成された状態
config/routes.rb
ルーティングの設定を行う
resources:<リソース名>
リソース名:コントローラーの名前 (_controller は含まない)
69
APNAME::Application.routes.draw do end
01 02 03
APNAME::Application.routes.draw do resources:posts end
01 02 03
resources:posts
ルーティングの設定2
resources について
resources により以下の経路が内部的に設定される
RESTFull な呼び出しに対応
70
リソース名 new_リソース名 edit_リソース名 リソース名 リソース名
GET POST GET GET GET PUT DELETE
/リソース名(.:format) /リソース名(.:format) /リソース名/new(.:format) /リソース名/:id/edit(.:format) /リソース名/:id(.:format) /リソース名/:id(.:format) /リソース名/:id(.:format)
リソース名#index リソース名#create リソース名#new リソース名#edit リソース名#show リソース名#update リソース名#destroy
プリフィックス メソッド URIパターン コントローラー#アクション
ルーティングの設定2
ルーティングの確認方法
rake routes による確認
PASE コマンド
アプリケーション・ルートをカレントにして実行
71
/QOpenSys/usr/bin/-sh > rake routes #
Verb GET POST GET GET GET PATCH PUT DELETE
URI Pattern /posts(.:format) /posts(.:format) /posts/new(.:format) /posts/:id/edit(.:format) /posts/:id(.:format) /posts/:id(.:format) /posts/:id(.:format) /posts/:id(.:format)
Controller#Action posts#index posts#create posts#new posts#edit posts#show posts#update posts#update posts#destroy
Prefix posts new_post edit_post post
rake routes
Ⅴ. 動作確認
72
ブラウザから実行
URL の指定
設定したルーティングに基づきURLを指定する
最初に一覧ページを表示するので以下のルーティングに準ずる
73
http://<サーバー名>:<IHS ポート番号>/<prefix>
例)サーバー名:www.tat.co.jp, ポート番号:2222 http://www.tat.co.jp:2222/posts
全体のイメージ
作成したアプリケーションの画面遷移
74
一覧画面 (index.html.erb)
登録画面 (new.html.erb)
編集画面 (edit.html.erb)
詳細画面 (show.html.erb)
index
destroy
new
create
edit
update edit show
index
画面イメージ
75
New Post
create Post
Edit
Show
Destroy
update Post
Edit
Back
index
まとめ
ハンズオン1
Ⅰ. サーバーの構築
RAILSNEW
RAILSSVR
Ⅱ. テーブルの作成
rails generate model
rake db:migrate
Ⅲ. アプリケーションの作成
rails generate scaffold_controller
Ⅳ. ルーティングの設定
route.rb (メモ帳:1行)
Ⅴ. 動作確認
76
ハンズオン2
ハンズオン2を題材に解説
77
ハンズオン2のフロー
ハンズオン2
I. 追加するプラグインの設定
II. プラグインのインストール
III. アプリケーションの修正
IV. Rails サーバーの再起動
V. 動作確認
78
Ⅰ. 追加するプラグインの設定
79
プラグインの設定
プラグイン
汎用性の高い機能を再利用可能な形でまとめたもの
「ライブラリ」や「ツール」とも呼ばれる
サードパーティーより多数提供されている
各言語、それぞれの形式がある
Perl:CPAN
PHP:Pear、Pecl
Ruby:Gem
プラグインの設定
Gem
Ruby で利用するプラグインの形式
Gem 形式の提供により統一された利用ができる
作成、公開、インストールが簡素化されている
主として RubyGems.org で公開
gem コマンドによりインストール等ができる
gem install <ライブラリ名>
プラグインの設定
Bundler
環境単位で RubyGems を管理するプラグイン
複数の Gem の導入を管理できる
依存関係の解決が容易
環境の再構築が容易
導入/利用する Gem のバージョン指定可能
/Gemfile ファイルに設定を記述し管理する
bundler install でインストールを実行
bundler install
プラグインの設定
Gemfile の記述方法1
source:Bundler に Gem の取得先を指定する
gem:使用する Gem を指定する
source ‘<場所を指すURL>’
gem ”<プラグイン名>”, “<バージョン情報>”
プラグインの設定
Gemfile の記述方法2
バージョンの指定方法
指定なし:最新のバージョンが導入される
バージョン番号:特定のバージョンが導入される
>=バージョン番号:指定されたバージョン以降が導入される
~=バージョン番号:指定されたバージョンの範囲内
例) gem “will_paginate”
例) gem “will_paginate”, “3.0”
例) gem “will_paginate”, “>=3.0”
例) gem “will_paginate”, “~>3.0” ※ 4.0 > Version >= 3.0
プラグインの設定
Gemfile の修正
修正前
修正後(最後に追記)
source 'https://rubygems.org' … 省略… # Use debugger # gem 'debugger', group: [:development, :test] gem 'thin' group :development do gem 'web-console' end
01 ・・・ 45 46 47 48 49 50
source 'https://rubygems.org' … 省略… # Use debugger # gem 'debugger', group: [:development, :test] gem 'thin' group :development do gem 'web-console' end gem 'will_paginate', ‘~> 3.0'
01 ・・・ 45 46 47 48 49 50 51 52 53
gem 'will_paginate', ‘~> 3.0'
参考:will_paginate
will_paginate
文章を複数のページに分割し、各ページへのリンクを並べアクセスし易くするプラグイン
GitHub
https://github.com/mislav/will_paginate
CSS 紹介サイト
Samples of pagination styles for will_paginate
http://mislav.uniqpath.com/will_paginate/
Ⅱ. プラグインのインストール
87
インストールの準備
インターネットに接続できない場合
1. ローカル・インストールのため、添付の「will_paginate-3.0.7.gem」をアプリケーション・ルートに配置する(FTP バイナリーモード)
2. QP2TERM を起動
3. cd アプリケーション・ルート
4. gem install will_paginate -l
88
インストールの準備
インターネットに接続できる場合
Gemfile の source を修正する
現状の soruce は https が記述されているためエラーになる
修正前
修正後
89
source 'https://rubygems.org' … 省略…
01 ・・・
source 'http://rubygems.org' … 省略…
01 ・・・
https → http
インストール
ローカル・インストールの実行
1. QP2TERM を起動
2. cd アプリケーション・ルート
3. bundle install --local
90
/QOpenSys/usr/bin/-sh > cd /www/APSVR/htdocs/APNAME # > bundle install [33mDon't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine. [0m Fetching gem metadata from https://rubygems.org/........... Resolving dependencies... Using rake 0.9.6 Using i18n 0.7.0.beta1 ・・・ <省略> ・・・ [32mYour bundle is complete! [0m [32mUse `bundle show [gemname]` to see where a bundled gem is installed. [0m #
インターネットに接続できる場合、--local は不要
Ⅲ. アプリケーションの修正
91
アプリケーションの修正
コントローラーの修正1
ページネーション用のデータを準備する
対象
app/controllers/posts_controller.rb
index アクション・メソッド
paginate メソッドにより実現
92
<インスタンス変数> = <モデル>.paginate(:page => params[:page])
アプリケーションの修正
コントローラーの修正2
修正前
修正後
93
class PostsController < ApplicationController before_action :set_post, only: [:show, :edit, :update, :destroy] # GET /posts # GET /posts.json def index @posts = Post.all end ・・・省略・・・
01 02 03 04 05 06 07 08
class PostsController < ApplicationController before_action :set_post, only: [:show, :edit, :update, :destroy] # GET /posts # GET /posts.json def index @posts = Post.paginate(:page => params[:page]) end ・・・省略・・・
01 02 03 04 05 06 07 08
アプリケーションの修正
モデルの修正1
1ページに表示するレコード数を設定する
対象
app/models/post.rb
per_page 変数に設定
94
self.per_page = <ぺージ数>
アプリケーションの修正
モデルの修正2
修正前
修正後
95
class Post < ActiveRecord::Base end
01 02
class Post < ActiveRecord::Base self.per_page = 3 end
01 02 03
アプリケーションの修正
ビューの修正1
ページネーションを実際に表示する
対象
app/views/index.html.erb
will_paginate ヘルパーメソッドを使用
96
<%= will_paginate <インスタンス変数> %>
アプリケーションの修正
ビューの修正2
修正前
修正後
97
<h1>Listing posts</h1> <table> <thead> <tr> <th>Title</th> ・・・省略・・・
01 02 03 04 05 ・・・
<h1>Listing posts</h1> <%= will_paginate @posts %> <table> <thead> <tr> <th>Title</th> ・・・省略・・・
01 02 03 04 05 06 ・・・
Ⅳ. Rails サーバーの再起動
98
サーバーの起動/停止
Rails サーバー:thin Server
起動/停止:RAILSVR CL コマンド
99
RAILSSVR
例)アプリケーション名:/www/APSVR/htdocs/APNAME RAILSSVR ACTION(*END) APP('/www/APSVR/htdocs/APNAME') RAILSSVR ACTION(*START) APP('/www/APSVR/htdocs/APNAME') VRM(*V20) PORT(2202)
Ⅴ. 動作確認
100
画面イメージ
will_paginate を追加した結果
101
まとめ
ハンズオン2
Ⅰ. 追加するプラグインの設定
Gemfile(メモ帳:1行)
will_paginate
Ⅱ. プラグインのインストール
bundle install [--local]
Ⅲ. アプリケーションの修正
controller (メモ帳:1行)
model (メモ帳:1行)
view (メモ帳:1行)
Ⅳ. Rails サーバーの再起動
RAILSSVR
Ⅴ. 動作確認
102
ハンズオン3
ハンズオン3を題材に解説
103
ハンズオン3のフロー
ハンズオン3
I. スタイルシートの準備
II. スタイルシートの配置
III. アプリケーションの修正
IV. 動作確認
104
スタイルシートの準備
添付のスタイルシートを使用(本来は作成する)
postslist.css
一覧画面を整形するスタイルシート
will_paginate.css
ページネイションを整形するスタイルシート
105
スタイルシートの配置
スタイルシートの規約
/app/assets/stylesheets に配置
106
アプリケーションの修正
ビューの修正1
使用する CSS を設定する
対象
app/views/index.html.erb
stylesheet_link_tag ヘルパーメソッドを使用
107
<%= stylesheet_link_tag <スタイルシート名> %>
アプリケーションの修正
ビューの修正2
修正前
修正後
108
<h1>Listing posts</h1> <%= will_paginate @posts %> <table> <thead> <tr> <th>Title</th> ・・・省略・・・
01 02 03 04 05 06 ・・・
<%= stylesheet_link_tag "postslist" %> <%= stylesheet_link_tag "will_paginate" %> <h1>Listing posts</h1> <%= will_paginate @posts %> <table> <thead> <tr> <th>Title</th> ・・・省略・・・
01 02 03 04 05 06 ・・・
まとめ
ハンズオン3
Ⅰ. スタイルシートの準備
postslist.css
will_paginate.css
Ⅱ. スタイルシートの配置
決められた場所へ
Ⅲ. アプリケーションの修正
view (メモ帳:2行)
Ⅴ. 動作確認
109
Ⅴ. 動作確認
110
画面イメージ
スタイルシートを適用した結果
111
PowerRuby 削除
PowerRuby の削除手順
112
PowerRuby 削除
PowerRuby 削除
1. ライセンスの削除
① DLTLIB LIB(POWER_RUBY)
② RMVDIR DIR('/PowerRuby') SUBTREE(*ALL)
2. アプリケーションの削除
① RMVDIR DIR(‘/www/<インスタンス名>’) SUBTREE(*ALL)
② RMVM FILE(QUSRSYS/QATMHINSTC) MBR(<インスタンス名>)
③ DLTLIB LIB(<ライブラリー名>_D)
DLTLIB LIB(<ライブラリー名>_T)
DLTLIB LIB(<ライブラリー名>_P)
113
とにかく触る事が大切です。 是非お役立てください。
114
最後に・・・ 会社紹介
「優しさ」と「信頼」で お客様のビジネスに “Goode Cycle” を。
受託開発 顧客研修 技術開発
信頼性においては定評のある IBM i をメインとしたアプリケーション開発を行います。お客様とのコミュニケーションを第一に考え、最適なソリューションをご提案しています。
外部研修にて IBM i コースを担当する専任のインストラクターがいます。また、お客様のご要望に応じたオーダーメイドの研修コースの提供も行います。
IBM i の最新技術だけでなく、お客様にとって必要になるであろうコンピュータ技術を日々蓄積しています。
ティアンドトラスト株式会社 〒111-0053 東京都台東区浅草橋4-16-4 ウィングエイトビル6F 03-5821-3666 / 03-5821-3668 https://tat.co.jp
最後に... 会社紹介
+ = α