IBM i - 2014 PowerRuby 入門 1.0 2014 -12 19 Ver. · ruby on rails Web...

Post on 09-Oct-2019

0 views 0 download

Transcript of IBM i - 2014 PowerRuby 入門 1.0 2014 -12 19 Ver. · ruby on rails Web...

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 support@powerruby.com. 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

最後に... 会社紹介

+ = α