42
Ruby on Rails (RoR) 講講 講講講講講講講 講講講講

Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

  • View
    229

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Ruby on Rails (RoR) 講習会

近畿大学大学院 田中大介

Page 2: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

本日の目標

更にすげぇWeb アプリケーションを作ろう!

Page 3: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

本日の予定 Rails de XML 関連するテーブルを扱うアプリ

1 対 1 、 1 対多、多対多 最終課題

Page 4: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Rails de XML

XML とは? タグを使用するマークアップ言語の一つ インターネットでのデータ交換を意識して

作られた言語 Web サービスで利用される Rest や SOAP

等の基盤言語となっている

Page 5: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Rails de XML

XML の利用例(マッシュアップ) Weather Bonk

Google の地図情報 + 天気の情報⇒ 地図上に天気を表示

Page 6: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Rails de XML

XML の利点 バイナリデータでなくテキストデータ

どんなコンピュータでも読むことができる データの意味を保持できる

< 値段 >1,000< 値段 > のように数字に意味を持たせることができる

データの構造を保持できる タグの中にタグを入れることができるため

Page 7: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Rails de XML

形式毎に出力が分けられる respond_to メソッド

format.html => html を要求されたときの出力 format.xml => XML を要求されたときの出力

URL に「 .xml 」を追加するだけ

Page 8: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Rails de XML

実演

Page 9: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Rails de XML

DBSWF アプリケーション

XML

Page 10: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ しくみ(例: Amazon の商品)

ID 商品名 値段 カテゴリ

1 アイス(ストロベリー)

300 食物

2 ジャケット(赤) 4,000 衣類3 スプーン 1,000 食器

商品テーブルDB

商品を売っている会社のデータを入れたい

Page 11: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ

ID 商品名 値段 カテゴリ

会社名 住所 電話

1 アイス(苺) 300 食物 CHN 東大阪 06-xxxx-xxxx

2 ジャケット(赤)

4,000 衣類 CHN 東大阪 06-xxxx-xxxx

3 スプーン 1,000 食器 田中店 寝屋川 072-yyy-yyyy

4 花 500 花 CHN 東大阪 06-xxxx-xxxx

5 カバン 10,000

雑貨 田中店 寝屋川 072-yyy-yyyy

商品(?)テーブル

電話番号が変更 ⇒ 全部変更しないといけない

Page 12: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ

ID 商品名 値段 カテゴリ

1 アイス(苺) 300 食物2 ジャケット

(赤)4,000 衣類

3 スプーン 1,000 食器4 花 500 花5 カバン 10,00

0雑貨

商品テーブル

ID 社名 住所 電話

1 CHN 東大阪 06-xxxx…

2 田中店 寝屋川 072-yyy….

会社テーブル

電話番号が変更 ⇒ 一箇所変更するだけで済む

テーブルの関連付け

Page 13: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ データの正規化

テーブルに同じデータが含まれないようにテーブルを切り分けること

特にデータが大きくなる場合、テーブルは正規化を行った方が良い

検索や更新の高速化、冗長データの除去などの利点がある

Page 14: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ テーブルの関連付け

商品:バーコード 商品 1 つに対してバーコードは 1 つ ⇒ 1 対 1

ID 商品名 値段 カテゴリ

1 アイス(苺) 300 食物2 ジャケット

(赤)4,000 衣類

3 スプーン 1,000 食器4 花 500 花5 カバン 10,00

0雑貨

商品テーブルID 番号 登録日時1 48aa… 08/01/01

2 48bb… 08/02/01

3 48cc… 08/03/01

4 48dd… 08/04/01

5 48ee… 08/05/01

バーコードテーブル

Page 15: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ テーブルの関連付け

商品:会社 会社 1 に対して商品は複数 ⇒ 1 対多

ID 商品名 値段 カテゴリ

1 アイス(苺) 300 食物2 ジャケット

(赤)4,000 衣類

3 スプーン 1,000 食器4 花 500 花5 カバン 10,00

0雑貨

商品テーブル

ID 社名 住所 電話

1 CHN 東大阪 06-xxxx…

2 田中店 寝屋川 072-yyy….

会社テーブル

Page 16: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ

ID 商品名 値段 カテゴリ

1 アイス(苺) 300 食物2 ジャケット

(赤)4,000 衣類

3 スプーン 1,000 食器4 花 500 花5 カバン 10,00

0雑貨

商品テーブル

ID 名前 住所 電話

1 森山 東大阪 06-xxxx…

2 田中 寝屋川 072-yyy….

ユーザテーブル

テーブルの関連付け 商品:購入者

商品 1 に対して購入者は複数 かつ購入者 1 に対して商品も複数 ⇒ 多対多

Page 17: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 関連付けの方法

1 対 1 、 1 対多 外部キーを用いる

多対多 関係テーブルを用いる

Page 18: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 外部キー

別のテーブルの主キー( ID )

ID 商品名 値段 カテゴリ

会社 ID

1 アイス(苺) 300 食物 1

2 ジャケット(赤)

4,000 衣類 1

3 スプーン 1,000 食器 2

4 花 500 花 1

5 カバン 10,000

雑貨 2

商品テーブル

ID 社名 住所 電話

1 CHN 東大阪 06-xxxx…

2 田中店 寝屋川 072-yyy….

会社テーブル

Page 19: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 関係テーブル

テーブル間の関係を記録したテーブルID 商品名 値段 カテゴ

リ1 アイス(苺) 300 食物2 ジャケット

(赤)4,000 衣類

3 スプーン 1,000 食器4 花 500 花5 カバン 10,00

0雑貨

ID 名前 住所 電話1 森山 東大阪 06-xxxx…

2 田中 寝屋川 072-yyy….

ID 商品 ID ユーザ ID

1 1 1

2 1 2

3 2 1

4 3 2

5 4 1

6 5 1

7 5 2

関連テーブル

Page 20: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対 1 アプリケーション( Product, Barcode )

1 対多アプリケーション( Product, Maker )

多対多アプリケーション( Product, User )

Page 21: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対 1 アプリケーション Product (商品)テーブル

商品名 ⇒ Name : String 値段 ⇒ Price : Integer カテゴリ ⇒ Category : String

Barcode (バーコード)テーブル 番号 ⇒ Code : String

Page 22: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対 1 アプリケーション1. Product テーブルで Scaffold2. Barcode テーブルで Scaffold3. 関連性を記述4. 確認

Page 23: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対 1 アプリケーション3. 関連性を記述

データベースに関連を追加1. generator で、 migration を指定して「 add_rel_

barcode_to_products 」2. できたファイルの self.up メソッドに、

「 add_column :products, :barcode_id, :integer 」

3. rake db:migrate

Page 24: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ メソッド補足

Rails には generator というコード生成プログラムがある

controller ⇒ コントローラとビューを生成 model ⇒ モデルを生成 scaffold ⇒ 雛形を一括作成 migration ⇒ マイグレーションファイル( DB の設計図)を

生成

add_column メソッド カラムを追加するメソッド add_column( カラムを追加するテーブル名 , カラム名 , 型 )

Page 25: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対 1 アプリケーション3. 関連性を記述

各モデルに関連性を追加 外部キーを持つモデル(今回は Product )に

「 belongs_to :barcode 」 外部キーを持たないモデル(今回は Barcod

e )に「 has_one :product 」

Page 26: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対 1 アプリケーション4. 確認

new.html.erb に<%= text_field :barcode, :code %>

product_controller.rb の create メソッドに@barcode = Barcode.new(params[:barcode])@product.barcode = @[email protected] を@product.save &&@barcode.save

show.html.erb に <%= @product.barcode.code %>

Page 27: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ メソッド補足

has_one 1 対 1 の関係 指定したモデルが、このモデルの子であることを宣言 子は一つしか持てない 引数は単数形 (ex. has_one :product)

has_many 1 対多、多対多の関係 指定したモデルが、このモデルの子であることを宣言 子を複数持つことができる 引数は複数形 (ex. has_one :products)

belongs_to 外部キーを設定したときに使用 指定したモデルが、このモデルの親であることを宣言 引数は単数形 (ex. has_one :product)

Page 28: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ メソッド補足

has_one, has_many, belongs_to 「モデル . 設定したモデル」とすると、

設定したモデルのテーブルから 設定したモデル _id というカラムをもとに

関連するモデルを取得する ex. @product.barcode

belongs_to :barcode としているので、 barcode テーブルから、 barcode_id を使って関連するモデルを取得する

Page 29: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ メソッド補足

text_field ( モデル名 , カラム名 ) テキストを入力する html フォームを作る 引数は(モデル名 , カラム名) input タグの name パラメータが、

”モデル名 [ カラム名 ]” に設定される

ボタンを押すと、フォームにある各 name パラメータの値が params に格納される

ex. text_field(:barcode, :code) ⇒ <input type=“text” name=“barcode[code]”/> ⇒ params[:barcode][:code] に値が入る

Page 30: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対多アプリケーション Product (商品)テーブル

商品名 ⇒ Name : String 値段 ⇒ Price : Integer カテゴリ ⇒ Category : String

Maker (会社)テーブル 社名 ⇒ Name : String 住所 ⇒ Address : String 電話番号 ⇒ telephone : String

Page 31: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対多アプリケーション1. Maker テーブルで Scaffold2. 関連性を記述3. 確認

Page 32: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対多アプリケーション2. 関連性を記述

データベースに関連を追加1. generator で、 migration を指定して「 add_rel_

maker_to_products 」2. できたファイルの self.up メソッドに、

「 add_column :products, :maker_id, :integer 」3. rake db:migrate

モデルに関連を追加( has_many と belongs_to )

Page 33: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

1 対多アプリケーション3. 確認

maker をいくつかいれる new.html.erb に

<%= collection_select :maker, :id, Maker.find(:all), :id, :name %> を追加

product_controller の create メソッドに@product.maker = Maker.find(params[:maker][:id])を追加

show.html.erb に会社の情報を表示する

Page 34: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ メソッド補足

collection_select DB を利用してセレクトボックスを作成するメソッド 引数は以下の5つ

params に格納するモデル名 params に格納するカラム名 セレクトボックスに使用する配列 params に格納するカラム セレクトボックスに表示するカラム

ex. collection_select(:maker, :id, Maker.find(:all), :id, :name) 全ての会社がセレクトボックスに表示される( 3 番目の引数) セレクトボックスに表示されるのは会社の名前 (5 番目の引数 ) params[:maker][:id] に値が格納される( 1, 2 番目の引数)

格納される値は、会社の ID(4 番目の引数 )

Page 35: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

多対多アプリケーション Product (商品)テーブル

商品名 ⇒ Name : String 値段 ⇒ Price : Integer カテゴリ ⇒ Category : String

User (顧客)テーブル 名前 ⇒ Name : String 住所 ⇒ Address : String 電話番号 ⇒ Telephone : String

History (購入履歴)テーブル 商品 ID ⇒ product_id 顧客 ID ⇒ user_id

Page 36: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

多対多アプリケーション1. User テーブルで Scaffold2. History テーブルで Scaffold3. データベース更新( db:migrate )4. 関連性を記述5. 確認

Page 37: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

多対多アプリケーション4. 関連性を記述

各モデルに関連を追加 Product.rb に

has_many :historieshas_many :users, :through => :histories を追加

User.rb にhas_many :historieshas_many :products, :through => :histories を追加

History.rb にbelongs_to :productbelongs_to :user を追加

Page 38: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

関連するテーブルを扱うアプリ 商品を管理するアプリケーション

多対多アプリケーション5. 確認

user をいくつかいれる 商品を売る uru メソッドを作成 show.html.erb で表示

Page 39: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

総合練習 自分の役に立つアプリケーションを組

んで下さい

Page 40: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

以上です お疲れ様でした!

Page 41: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!
Page 42: Ruby on Rails (RoR) 講習会 近畿大学大学院 田中大介. 本日の目標 更にすげぇ Web アプリケーションを作ろう!

Plugin について Rails プラグイン

他の人が作った便利な追加機能 Rails では、 script/plugin で扱うことがで

きる