0) { obj.className = "imgborder_on"; } } } function hideImage(obj) { if (obj.className.substr(0, 10) == "imgborder_") { obj.src = eyeglass.src; obj.className = "imgborder_off"; } } function showAllImages() { imgs = document.images; for (i=0; i < imgs.length; i++) { showImage(imgs[i]); } } function hideAllImages() { imgs = document.images; for (i=0; i < imgs.length; i++) { hideImage(imgs[i]); } } //-->
OracleおよびRuby on Railsの使用
目的
このチュートリアルでは、OracleとRuby/Railsのインストールおよび非常に効率的で機能的なRuby/Railsアプリケーションの開発方法を説明します。 エンタープライズの強力なRuby/Railsアプリケーションを作成するために必要な知識を習得できます。
トピック
このチュートリアルでは、以下のトピックについて説明します。
スクリーンショットの表示
このアイコンの上にカーソルを置くと、
すべてのスクリーンショットがロードし、表示されます。 (警告: すべてのスクリーンショットが同時にロードされるため、ご使用のインターネット接続によってはレスポンス・タイムが遅くなる場合があります。)
注: 各手順に関連したスクリーンショットのみを表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 スクリーンショットをクリックすると、非表示になります。
概要
Ruby on Railsは、速度を向上させてデータベース・ドリブンなWebサイトの作成を簡素化する無償のWebアプリケーション・フレームワークです。最初からスケルトン・コード・フレームワーク(足場)が提供されています。 一般的に
Railsまたは
RoRと呼ばれるRuby on Railsは、Rubyプログラミング言語で記述されたオープン・ソース・プロジェクトです。Railsフレームワークを使用したアプリケーションは、Model-View-Controller設計パターンで開発されます。
RoRは、J2EEおよびPHPプログラマの間で非常に注目を集めています。 RoRの長所を検討すると、J2EEおよびPHPプログラマが注目する理由がわかります。 たとえば、設計パターンの専門家が賞賛する厳密なModel-View-Controllerアーキテクチャを使用する点は、J2EE開発者にとって魅力的です。 また、Railsを使用した基本システムの構築の容易さは、PHP開発者にとって魅力的です。
RoRは、MVCの効果的なソリューションを提供します。 モデルは、データだけではありません。データに適用されるすべてのビジネス・ルールを施行します。 モデルは、ゲートキーパーおよびデータ・ストアとして機能します。 ビューでは、モデルのデータに基づくユーザー・インタフェースの作成を管理します。 ビューではユーザーによるさまざまなデータ入力を実行できますが、ビュー自体は入力データを処理しません。 ビューの機能は、データ表示のみです。 コントローラは、外部(通常、ユーザー入力)からイベントを受信し、モデルとやり取りして、ユーザーに適切なビューを表示します。
RoRは、オブジェクト・リレーショナル・マッピング(ORM)層としてActiveRecordを提供し、データベースの接続とデータの操作を行います。 ActiveRecordは、標準のORMモデル(表とクラス、行とオブジェクト、列とオブジェクト属性)に厳密に準拠します。
Railsアプリケーションが作成されると、ルートの下に次のディレクトリとファイルが作成されます。 app、components、config、db、doc、lib、log、public、Rakefile、README、script、test、tmp、vendor
Rubyは、簡易性と生産性に注目した動的なオープン・ソースのプログラミング言語です。 読みやすく書きやすい、優れた構文が提供されます。 Ruby言語の詳細は、
付録:Ruby入門を参照してください。
詳細情報を取得するには、
Ruby on Rails OTNフォーラム(US OTN 内の掲示板、英語)を参照してください。
トピック・リストに戻る
前提条件
この実践的なセッションには、以下を事前にインストールする必要があります。
| 1.
|
Oracle Database 11gをインストール済みであること。
|
| 2.
|
Oracle Instant ClientおよびOracleOnRails(ruby、rubygems、activesupport、activerecord、rake、ruby-oci8など)をインストール済みであること。また、スキーマを構成していること。
付録:OracleとRuby on Railsのインストールの手順を参照してください。
|
| 3.
|
rubyrails.tarファイルをダウンロードして解凍していること。 ファイルには、このチュートリアルを実行するために必要なすべてのファイルが含まれます。
|
トピック・リストに戻る
1. 接続の作成
この項で使用するコマンドは、以下のとおりです。
| OCI8.new (userid, password, dbname = nil, privilege = nil):
|
ユーザーIDおよびパスワードでOracleに接続します。 dbnameは、Net8の接続文字列です。 DBA権限が必要な場合、SYSDBAまたはSYSOPER権限を設定してください。
|
| OCI8#logoff
|
Oracleの接続を解除します。 コミットされていないトランザクションはロールバックされます。
|
| OCIError
|
Oracleエラー・コードを使用した例外クラスです。
OCIError#messageによるエラー・メッセージと
OCIError#codeによるエラー・コードを取得できます。
|
Rubyスクリプトの作成タスクでは、最初にデータベースの接続を作成します。 以下の手順を実行します。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
connect.rb
を実行します。
ruby connect.rb
接続に成功すると、次のメッセージが表示されます。接続に失敗すると、エラーが表示されます。
|
| 2.
|
このチュートリアルの残りのスクリプトに含まれるコマンドは、以下のとおりです。
require 'config.rb'
#create connection
conn = OCI8.new(DB_USER, DB_PASSWORD, DB_SERVER)
# operations on conn goes here
#log out
conn.logoff
|
トピック・リストに戻る
2. データの問合せ
この項で使用するコマンドは、以下のとおりです。
| OCI8#parse (sql)
|
カーソルを作成し、SQL文の実行を準備して、OCI8::Cursorインスタンスを返します。
|
| OCI8#exec (sql, *bindvars)
|
SQL文を実行します。 戻り値のタイプは、SQL文のタイプによって異なります。
bindvarsを指定すると、実行前にバインド変数としてバインドされます。
|
| OCI8::Cursor#exec(*bindvars)
|
カーソルに割り当てられたSQL文を実行します。 戻り値のタイプは、SQL文のタイプによって異なります。 |
| OCI8::Cursor#getColNames
|
選択リストの名前を配列で取得します。 exec後にこのメソッドを使用してください。 |
簡単な問合せを作成して結果を表示するには、以下の手順を実行します。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
fetch.rb
スクリプトを実行します。
ruby fetch.rb
出力のスクリーンショットは、以下のとおりです。
|
| 2.
|
Rubyに固有のコードを記述する別の方法があります。 端末ウィンドウから、次のコマンドを実行して
fetch_r.rb
スクリプトを実行します。
ruby fetch_r.rb
出力のスクリーンショットは、以下のとおりです。
|
トピック・リストに戻る
3. バインド変数
バインド変数を使用すると、コードの再利用性が向上し、SQLインジェクション攻撃のリスクがなくなります。 この項で使用するコマンドは、以下のとおりです。
| OCI8::Cursor#bind_param(key, val, type = nil, length = nil)
|
明示的なバインド変数。 キーが数値の場合、1で始まる位置によってバインドされます。 キーが文字列の場合、プレースホルダの名前でバインドされます。
|
| OCI8#exec (sql, *bindvars) or OCI8::Cursor#exec(*bindvars)
|
bindvarsで変数をバインドすることもできます。
|
| OCI8::Cursor#[key]
|
バインド変数の値を取得/設定します。 |
この例でバインド変数を使用するには、以下の手順を実行します。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
bind.rb
スクリプトを実行します。
ruby bind.rb
出力のスクリーンショットは、以下のとおりです。
|
| 2.
|
バインド変数を使用してパフォーマンスの向上をテストするには、次のコマンドを実行して
bind_perf_test.rb
スクリプトを実行します。
ruby bind_perf_test.rb
出力のスクリーンショットは、以下のとおりです。
|
トピック・リストに戻る
4. データ型の定義
この項で使用するコマンドは、以下のとおりです。
| OCI8::Cursor#define(pos, type, length = nil)
|
parseおよびexec内でこのメソッドを使用します。posは1から開始されます。 タイプが文字列の場合に長さが使用されます。
|
フェッチした値のデータ型を明示的に示すことができます。 この例でデータ型を定義するには、以下の手順に従います。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
define.rb
スクリプトを実行します。
ruby define.rb
出力のスクリーンショットは、以下のとおりです。
2つのブロック出力の違いを確認できます。
|
トピック・リストに戻る
5. トランザクション管理
Oracleデータベースのデータを操作する場合(データの挿入、更新、または削除)、変更されたデータや新しいデータは、データベースにコミットされるまでデータベース・セッション内でのみ使用できます。 変更されたデータがデータベースにコミットされた後は、他のユーザーおよびセッションでも使用できます。 これがデータベース・トランザクションです。
各変更を個別にコミットすると、サーバーに余分なロードが発生します。 通常、コミットされたデータをすべて使用するかまったく使用しないかのいずれかです。独自のトランザクション制御には、パフォーマンスとデータ整合性の利点があります。
この項で使用するコマンドは、以下のとおりです。
| OCI8#autocommit
|
autocommitモードの状態を取得/設定します。 デフォルト値はfalseです(ログオフ時にコミットされていないトランザクションがロールバックされるので注意してください)。 trueの場合、挿入/更新/削除文を実行するたびにトランザクションが自動的にコミットされます。
|
| OCI8#commit()
|
トランザクションをコミットします。 |
| OCI8#rollback()
|
トランザクションをロールバックします。 |
トランザクションの管理方法を学習するには、以下の手順を実行します。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
transaction.rb
スクリプトを実行します。
ruby transaction.rb
このスクリプトは、conn1接続を使用して行を更新します。 Oracleの新しいデータは、コミットされるまで元のデータベース・セッションにのみ表示されます。 出力のスクリーンショットは、以下のとおりです。
この場合、conn2接続は、conn1のコミットされていないトランザクションで発生した内容を認識していません。
|
| 2.
|
transaction.rb
スクリプトを更新し、
conn1.autocommit = trueをコメントアウトして、ファイルを保存します。
次のコマンドを使用して、スクリプトを再実行します。
ruby transaction.rb
conn2が新しい内容を認識します。 出力のスクリーンショットは、以下のとおりです。
|
| 3.
|
各行を個別にコミットすると、サーバーに余分なロードが発生します。 各行の個別のコミット間とトランザクションの最後のパフォーマンスの違いを比較できます。 違いをテストするには、次のコマンドを使用して
trans_perf_test.rb
スクリプトを実行します。
ruby trans_perf_test.rb
2つ目の数値が1つ目の数値より小さいことを確認します。 出力のスクリーンショットは、以下のとおりです。
|
トピック・リストに戻る
6. PL/SQLの使用
PL/SQLは、SQLを拡張したOracleの手続き型言語です。 PL/SQLストアド・プロシージャおよび関数がデータベースに格納されるので、迅速なアクセスが実現します。 PL/SQLストアド・プロシージャを使用すると、アプリケーションのデータベースへのアクセス方法に関係なくすべてのデータベース・アプリケーションでロジックを再利用できます。 データをプログラム(Rubyなど)に抽出して処理するよりも速く、多くのデータ関連操作をPL/SQLで実行できます。
この項で使用するコマンドは、以下のとおりです。
| DBMS_UTILITYおよびDBMS_OUTPUT
|
Oracleストアド・パッケージ。 TO_CHARは、組込み関数です。
|
RubyスクリプトでPL/SQLプロシージャおよび関数を呼び出すには、以下の手順を実行します。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
plsql.rb
スクリプトを実行します。
ruby plsql.rb
出力のスクリーンショットは、以下のとおりです。
|
トピック・リストに戻る
7. LOBの使用:イメージの格納/取得
Oracleキャラクタ・ラージ・オブジェクト(CLOB)およびバイナリ・ラージ・オブジェクト(BLOB)列(およびPL/SQL変数)は大量(ギガバイト)の文字とバイナリ・データを含みます。 この項で使用するコマンドは、以下のとおりです。
| OCI8::BLOB#available
|
BLOBを使用できるかどうか確認します。 BLOBを使用するには、最初にEMPTY_BLOB()を挿入する必要があります。
|
| OCI8::BLOB#read(size = nil)
|
BLOBから最大サイズのバイトで読み取ります。サイズが省略される場合はファイルの最後まで読み取ります。 |
| OCI8::BLOB#write(string)
|
特定の文字列をBLOBに書き込みます。 |
小さいアプリケーションを作成してデータベースにイメージをロードして表示するには、以下の手順を実行します。
| 1.
|
PNGファイルは、スクリプト・ファイルと同じフォルダにあります。
downloadというフォルダを作成します。 端末ウィンドウから、次のコマンドを実行して
blob.rb
スクリプトを実行します。
mkdir download
ruby blob.rb
出力のスクリーンショットは、以下のとおりです。
|
トピック・リストに戻る
8. XMLの使用
Oracleデータベースのすべてのエディションには、"XML DB"が含まれます。 このテストでは、OracleからRubyにXMLデータを返す基本事項を説明します。 この項で使用するコマンドは、以下のとおりです。
| DBMS_XMLGEN.getxml (statement)
|
SELECT文に基づいて、リレーショナル・データからXMLを作成します。 CLOBが返されます。
|
Oracleの基本的なXML機能を学習するには、以下の手順を実行します。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
xml.rb
スクリプトを実行します。
ruby xml.rb
出力のスクリーンショットは、以下のとおりです。
|
トピック・リストに戻る
9. ActiveRecordの使用
ActiveRecordは、ビジネス・オブジェクトとデータベース表に接続して、単一のラッピングでロジックとデータを表す永続的なドメイン・モデルを作成します。 これは、オブジェクト・リレーショナル・マッピング(ORM)設計パターンの実装です。 この例でActiveRecordを使用するには、以下の手順に従います。
| 1.
|
端末ウィンドウから、次のコマンドを実行して
activerecord.rb
スクリプトを実行します。
ruby activerecord.rb
出力のスクリーンショットは、以下のとおりです。
|
トピック・リストに戻る
10. Ruby On Rails(RoR):移行および足場
このチュートリアルの後半では、以下の用語を使用します。
| Rake
|
他のRubyプログラムを作成するRubyプログラム。 RailsでRakeを使用して、db:migrate、db:schema:dump、db:schema:load、db:test:prepare、db:test:purgeなどの一連のタスクを実行します。 一般的なLinux makeツールと範囲および目的が似ています。
|
| 移行
|
開発者は、データ記述言語(DDL)の代わりにRubyでデータベース・オブジェクトを作成、変更、および削除できます。 |
| 足場
|
ActiveRecordクラスによって反映されるエントリを作成、編集、参照、削除できるデータの簡単なインタフェースを提供します。 足場が作成されると、そこにはコントローラ・ファイル(アプリケーション・ユーザーが次に移動するページを決定する)とビュー・ファイル(アプリケーション・ユーザーが参照するページをレンダリングする)が含まれます。 |
移行と足場を使用してRailsアプリケーションを作成するには、以下の手順を実行します。
| 1.
|
holappというもっとも基本的なRailsアプリケーションを作成します。 端末ウィンドウから、次のコマンドを実行します。
rails holapp
cd holapp
gedit config/database.yml
|
| 2.
|
config/database.ymlファイルのdevelopmentセクションを次の内容に置き換えて、ファイルを保存して閉じます。
development:
adapter: oracle
database: orcl11g
username: hr
password: hr
|
| 3.
|
comicモデルを作成できます。 端末ウィンドウから、次のコマンドを実行します。
ruby script/generate model comic
|
| 4.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit db/migrate/001_create_comics.rb
|
| 5.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
create_table :comics do |t|
t.column :name,:string
t.column :description, :string
t.column :price, :float
end
end
|
| 6.
|
データベースの移行にRakeを実行して、ターゲット表を作成できます。
端末ウィンドウで次のコマンドを入力します。
rake db:migrate
|
| 7.
|
次のコマンドを使用して、comicモデルの足場を作成できます。
ruby script/generate scaffold comic
|
| 8.
|
Webrickは、サーブレットを使用して機能を拡張するRubyで記述されたHTTPサーバー・ライブラリです。 次のコマンドを使用して、Webrickサーバーを起動できます。
ruby script/server
|
| 9.
|
アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。
http://localhost:3000/comics
アプリケーションが正しく動作することを確認するために「
New Comic」をクリックして、レコードを作成します。
|
トピック・リストに戻る
11. RoR:1対1の関係の表
1対1の関係は、表Aの1行が表Bの0行または1行と関連付けられていることを表します。 1対1の関係の表を使用したRailsアプリケーションを作成するには、以下の手順を実行します。
| 1.
|
別の端末ウィンドウを開いて、次のコマンドを実行します。
cd /home/oracle/Work/ruby/holapp
source /etc/bashrc
|
| 2.
|
注文および請求書のモデルを作成します。 端末ウィンドウから、次のコマンドを実行します。
ruby script/generate model order
ruby script/generate model invoice
|
| 3.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit db/migrate/002_create_orders.rb
|
| 4.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
create_table :orders do |t|
t.column :name, :string
t.column :description, :string
end
end
|
| 5.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit db/migrate/003_create_invoices.rb
|
| 6.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
create_table :invoices do |t|
t.column :order_id, :integer
t.column :invoicetype, :string
t.column :description, :string
t.column :amount, :float
end
end
|
| 7.
|
データベースの移行にRakeを実行して、ターゲット表を作成できます。
端末ウィンドウで次のコマンドを入力します。
rake db:migrate
|
| 8.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit app/models/order.rb
|
| 9.
|
ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。
class Order < ActiveRecord::Base
has_one :invoice
end
|
| 10.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit app/models/invoice.rb
|
| 11.
|
ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。
class Invoice < ActiveRecord::Base
belongs_to :order
end
|
| 12.
|
次のコマンドを使用して、注文モデルの足場を作成できます。
ruby script/generate scaffold order
|
| 13.
|
作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
app/views/orders/list.rhtml
|
| 14.
|
Order.content_columnsをこのファイルの
Order.columnsに置き換えます。
ファイルを保存し、閉じます。
|
| 15.
|
次のコマンドを使用して、請求書モデルの足場を作成できます。
ruby script/generate scaffold invoice
|
| 16
.
|
作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
app/views/invoices/list.rhtml
|
| 17.
|
Invoice.content_columnsをこのファイルの
Invoice.columnsに置き換えます。
ファイルを保存し、閉じます。
|
| 18.
|
アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。
http://localhost:3000/orders
新しい注文を作成します。
|
| 19.
|
足場の作成時にデフォルトでコントローラ・ファイルがRailsによって作成されます。 これらのコントローラ・ファイルには、Railsによって作成されたデフォルト以外の方法でアプリケーションを操作する場合に、変更を要するデフォルトのアクションがあります。 端末ウィンドウで次のコマンドを入力します。
gedit app/controllers/invoices_controller.rb
|
| 20.
|
ファイルの
createセクションを以下に置き換えて、ファイルを保存して閉じます。
def create
@order = Order.find(:first, :order => "id DESC")
@invoice = Invoice.new(params[:invoice])
if @invoice.save
if !@order.nil?
@order.invoice = @invoice
end
flash[:notice] = 'Invoice was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end
|
| 21.
|
アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。
http://localhost:3000/invoices
新しい請求書を作成します。 請求書を作成した後、作成した最後の注文に請求書が関連付けられていることがわかります。
|
トピック・リストに戻る
12. RoR:1対多の関係の表
1対多の関係は、表Aの1行が表Bの任意の行(0行、1行、または複数行)と関連付けられていることを表します。 1対多の関係の表を使用したRailsアプリケーションを作成するには、以下の手順を実行します。
| 1.
|
注文および請求書のモデルを作成します。 端末ウィンドウから、次のコマンドを実行します。
ruby script/generate model line_item
|
| 2.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
db/migrate/004_create_line_items.rb
|
| 3.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
create_table :line_items do |t|
t.column :order_id, :integer
t.column :subject, :string
t.column :description, :string
end
end
|
| 4.
|
データベースの移行にRakeを実行して、ターゲット表を作成できます。
端末ウィンドウで次のコマンドを入力します。
rake db:migrate
|
| 5.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit app/models/order.rb
|
| 6.
|
次のように
has_many :line_itemsエントリをファイルに追加します。 ファイルを保存し、閉じます。
class Order < ActiveRecord::Base
has_one :invoice
has_many :line_items
end
|
| 7.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit app/models/line_item.rb
|
| 8.
|
ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。
class LineItem< ActiveRecord::Base
belongs_to :order
end
|
| 9.
|
次のコマンドを使用して、line_itemモデルの足場を作成できます。
ruby script/generate scaffold line_item
|
| 10.
|
作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
app/views/line_items/list.rhtml
|
| 11.
|
LineItem.content_columnsをこのファイルのLineItem.columnsに置き換えます。 ファイルを保存し、閉じます。
|
| 12.
|
アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。
http://localhost:3000/line_items
新しい注文を作成します。
|
| 13.
|
コントローラ・ファイルを変更します。 端末ウィンドウで次のコマンドを入力します。
gedit app/controllers/line_items_controller.rb
|
| 14.
|
ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。
def create
@order = Order.find(:first, :order => "id DESC")
@line_item = LineItem.new(params[:line_item])
if @line_item.save
if !@order.nil?
@order.line_items << @line_item
end
flash[:notice] = 'LineItem was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end
|
| 15.
|
アプリケーションを表示できます。 ブラウザ・ウィンドウを開いて、次のURLを入力します。
http://localhost:3000/line_items
2つの品目を作成します。 作成した最後の注文にこれらの品目が関連付けられていることがわかります。
|
トピック・リストに戻る
13. RoR:多対多の関係の表
多対多の関係は、表Aの任意の複数の行が表Bの任意の複数の行と関連付けられていることを表します。 多対多の関係の表を使用したRailsアプリケーションを作成するには、以下の手順を実行します。
| 1.
|
記事、著者、およびarticles_authorのモデルを作成します。 端末ウィンドウから、次のコマンドを実行します。
ruby script/generate model article
ruby script/generate model author
ruby script/generate model articles_author
|
| 2.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
db/migrate/005_create_articles.rb
|
| 3.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
create_table :articles do |t|
t.column :title, :string
t.column :abstract, :string
end
end
|
| 4.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
db/migrate/006_create_authors.rb
|
| 5.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
create_table :authors do |t|
t.column :name, :string
t.column :vocation, :string
end
end
|
| 6.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
db/migrate/007_create_articles_authors.rb
|
| 7.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
create_table :articles_authors do |t|
t.column :article_id, :integer
t.column :author_id, :integer
end
end
|
| 8.
|
データベースの移行にRakeを実行して、ターゲット表を作成できます。
端末ウィンドウで次のコマンドを入力します。
rake db:migrate
|
| 9.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit app/models/article.rb
|
| 10.
|
次のようにファイルの内容を置き換えます。 ファイルを保存し、閉じます。
class Article < ActiveRecord::Base
has_and_belongs_to_many :authors
set_sequence_name "ARTICLES_AUTHORS_SEQ"
end
|
| 11.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit app/models/author.rb
|
| 12.
|
次のようにファイルの内容を置き換えます。 ファイルを保存し、閉じます。
class Author < ActiveRecord::Base
has_and_belongs_to_many :articles
set_sequence_name "ARTICLES_AUTHORS_SEQ"
end
|
| 13.
|
次のコマンドを使用して、記事モデルの足場を作成できます。
ruby script/generate scaffold article
|
| 14.
|
作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
app/views/articles/list.rhtml
|
| 15.
|
Article.content_columnsをこのファイルの
Article.columnsに置き換えます。ファイルを保存し、閉じます。
|
| 16.
|
次のコマンドを使用して、著者モデルの足場を作成できます。
ruby script/generate scaffold author
|
| 17.
|
作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
app/views/authors/list.rhtml
|
| 18.
|
Author.content_columnsをこのファイルの
Author.columnsに置き換えます。ファイルを保存し、閉じます。
|
| 19.
|
次のコマンドを使用して、articles_authorモデルの足場を作成できます。
ruby script/generate scaffold articles_author
|
| 20.
|
作成されたhtmlを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit
app/views/articles_authors/list.rhtml
|
| 21.
|
ArticlesAuthor.content_columnsをこのファイルの
ArticleAuthor.columnsに置き換えます。ファイルを保存し、閉じます。
|
| 22.
|
コントローラ・ファイルを変更します。 端末ウィンドウで次のコマンドを入力します。
gedit app/controllers/articles_controller.rb
|
| 23.
|
ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。
def create
@author = Author.find(:first, :order => "id DESC")
@article = Article.new(params[:article])
if @article.save
if !@author.nil?
@author.articles << @article
end
flash[:notice] = 'Article was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end
|
| 24.
|
端末ウィンドウで次のコマンドを入力します。
gedit app/controllers/authors_controller.rb
|
| 25.
|
ファイルの内容を以下に置き換えて、ファイルを保存して閉じます。
def create
@article = Article.find(:first, :order => "id DESC")
@author = Author.new(params[:author])
if @author.save
if !@article.nil?
@article.authors << @author
end
flash[:notice] = 'Author was successfully created.'
redirect_to :action => 'list'
else
render :action => 'new'
end
end
|
| 26.
|
アプリケーションを表示できます。 ブラウザ・ウィンドウで、次のURLを入力します。
http://localhost:3000/articles
記事を作成します。
|
| 27.
|
ブラウザ・ウィンドウで、次のURLを入力します。
http://localhost:3000/authors
2人の著者を作成します。
|
| 28.
|
次のURLを入力すると、著者と記事の関連性を確認できます。
http://localhost:3000/articles_authors
|
| 29.
|
次のURLに戻って、3つの記事を作成します。
http://localhost:3000/articles
|
| 30.
|
次のURLを入力して、作成した記事が作成した最後の著者に関連付けられていることを確認します。
http://localhost:3000/articles_authors
|
トピック・リストに戻る
まとめ
このチュートリアルで学習した内容は、次のとおりです。
トピック・リストに戻る
関連情報
トピック・リストに戻る
付録:Ruby入門
ここでは、Ruby言語の概要を説明します。 使用するオブジェクトは、以下のとおりです。 Rubyに精通している場合、この項をスキップして次の項に進んでください。
|
|
| $var |
#グローバル変数 |
| @var |
#インスタンス変数 |
| VAR |
#定数 |
| SomeClass::VAR |
#クラス内の定数 |
| varまたは_var |
#ローカル変数 |
|
|
|
|
self、nil、true、false
|
| FILE #現在のソース・ファイル
|
| LINE #現在の行
|
|
|
配列
|
|
[1,2,3]
|
|
["dog", "cat", "pig"]は%w(dog cat pig)と同じ
|
| [ 1, 'cat', 3.14 ] |
|
|
ハッシュ
|
|
{expr1 => exprA, expr2 => exprB }
|
hashvar = { 'dog' => 'Frank', 'cat' => 'Sissi', 'donkey' => 'Tim' }
hashvar.length # 3
hashvar['dog'] # "Frank"
hashvar['cow'] = 'Ethan'
|
|
|
範囲
|
expr1
.. expr2 #最後の要素を含む
expr1
... expr2 #最後の要素を除く
|
|
|
文字列リテラル
|
|
#二重引用符で囲まれた文字列には式展開が適用されます
"remember to escape \" and \\ #{expression_substituted}"
#一重引用符で囲まれた文字列は評価されません
'remember to escape \' and \\ #{expression_not_substituted}'
|
|
|
イテレータ
|
| |
[ 1, 1, 2, 3, 5 ].
each {|val|
print val, " " } # 1 1 2 3 5
|
| |
3.times
do
print "Ho! "
end # Ho! Ho! Ho!
|
|
|
メソッドの呼出し
|
|
method(args1, arg2)
|
| method(*array)、method(array_member1, array_member2, …)と同じ |
|
|
演算子
|
|
+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||
foo += 5
foo, bar, baz = 1, 2, 3
foo, bar = 1 # foo = 1; bar = nil
foo,*bar = 1, 2, 3 #foo = 1; bar = [2, 3]と同じ(複数の割当てを表す*を使用して配列を割り当てます)
|
|
|
開始ブロック
|
|
# beginは、大文字の
BEGINとは異なります(まったく違う意味になります)
#expr1に例外が発生すると、
rescueはexpr2を実行します。
kind_of?.
else句によって実行されるerror_typeの照合は
#
rescueの後にexpr1で例外が発生しない場合
#に実行されます。
ensure句は、伝播プロセス中に捕捉されない例外が存在する場合でも
#ブロックの終了時に必ず実行されます。
begin
expr1..
[
rescue [error_type,..]
expr2..]..
[
else
expr3..]
[
ensure
expr4..]
end
|
|
|
ブロック
|
|
search_engines =
%w[Google Yahoo MSN].map do |engine|
"http://www." + engine.downcase + ".com"
end
|
|
|
制御構造
|
|
falseと
nilはfalseです。他はすべてtrueです。
if expr [
then]
expr...
[
elsif expr [
then]
expr...]...
[
else
expr...]
end
unless expr [
then]
expr...
[
else
expr...]
end
expr1
if expr2 #expr2がtrueの場合、expr1を実行します
expr1
unless expr2 #expr2がfalseの場合、expr1を実行します
# ===演算子を使用して、case文を比較します
case expr
[
when expr [, expr]...[
then]
expr..]..
[
else
expr..]
end
while expr [
do]
#コードがここに設定されます
end
until expr [
do]
#コードがここに設定されます
end
expr1
while expr2 #expr2がtrueの間、expr1を評価します
expr1
untill expr2 #expr2がfalseの間、expr1を評価します
begin expr1
until expr2 #expr2がfalseの間、少なくとも1回expr1を評価します
for lhs...
in expr [
do]
expr..
end
#ループ本文に使用できる2つの特別なキーワードがあります。
next #もっとも内側のループの次の反復へジャンプします
redo #ループ条件を確認しないでもっとも内側のループ
#の現在の反復を再開します
|
|
トピック・リストに戻る
付録:Railsの移行を使用したデータベース表の変更方法
Railsで
"comics"表に
"t.column :price, :float"列を追加するには、以下の手順を実行します。
| 1.
|
comicモデルを作成できます。 端末ウィンドウから、次のコマンドを実行します。
ruby script/generate migration add_columns
|
| 2.
|
作成されたスクリプトを編集します。 端末ウィンドウで次のコマンドを入力します。
gedit db/migrate/008_add_columns.rb
|
| 3.
|
self.upセクションを次の内容に置き換えて、ファイルを保存して閉じます。
def self.up
add_column :comics, :author, :string
end
|
| 4.
|
データベースの移行にRakeを実行して、ターゲット表を作成できます。
端末ウィンドウで次のコマンドを入力します。
rake db:migrate
注: 列を削除するには、self.upメソッドに"remove_column :comics, :price"のような行を追加します。列の名前を変更するには、self.upメソッドに"rename_column :comics, :price, :new_price"のような行を追加します。列を変更するには、self.upメソッドに"change_column :comics, :price, :integer"のような行を追加します。
また、"rake db:migrate VERSION=xx"(xxはロールバックするバージョン)コマンドを発行して、移行操作をロールバックできます。
|
トピック・リストに戻る
付録:OracleとRuby on Railsのインストール
ここでは、Oracle Databaseを使用したRuby on Railsアプリケーションを実行するために必要なOracle Instant Client、Ruby、Ruby/OCI8、RubyGems、およびRailsのインストール方法を説明します。
| 1.
|
US OTNからOracle Instant Clientをダウンロードします。 端末ウィンドウを開いて、次のコマンドを実行します。
su
<password to root is oracle>
|
| 2.
|
Oracle Instant Clientソフトウェアは、標準のOracleクライアントをインストールせずに、またはORACLE_HOMEの作成なしでアプリケーションを実行できます。 Oracle Instant Clientをインストールするには、次のコマンドを実行します。
rpm -ivh oracle-instantclient-basic-10.2.0.3-1.i386.rpm
rpm -ivh oracle-instantclient-devel-10.2.0.3-1.i386.rpm
|
| 3.
|
libclntsh.so.10.1が
LD_LIBRARY_PATH環境変数で示されるライブラリ検索パスに設定されているディレクトリを追加する必要があります。 次のコマンドを入力して、bashプロファイルを更新します。
gedit /etc/bashrc
|
| 4.
|
次の行を
/etc/bashrcファイルの最後に追加して、ファイルを保存してエディタを閉じます。
source /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib:$LD_LIBRARY_PATH
|
| 5.
|
次のコマンドを実行して、
oracle_env.shスクリプトを実行します。
source /etc/bashrc
|
| 6.
|
Rubyをインストールするには、以下の手順を実行します。
tar -xzvf ruby-1.8.6.tar.gz
cd ruby-1.8.6
./configure
make
make install
|
| 7.
|
RubyGemsは、サード・パーティ製のライブラリを公開および管理するRuby標準です。 RubyGemsをインストールするには、以下の手順を実行します。
cd ..
tar -xzvf rubygems-0.9.4.tar.gz
cd rubygems-0.9.4
ruby setup.rb
|
| 8.
|
Ruby/OCI8は、OCI8 APIを使用したOracleのRubyインタフェースです。 Ruby/OCI8をインストールするには、次のコマンドを実行します。
cd ..
tar -xzvf ruby-oci8-0.1.16.tar.gz
cd ruby-oci8-0.1.16
ruby setup.rb config --with-instant-client
ruby setup.rp setup
ruby setup.rb install
|
| 9.
|
Ruby DBIモジュールは、Perl DBIモジュールと似ているRubyスクリプトのデータベースに依存しないインタフェースを提供します。 Ruby/DBIをインストールするには、次のコマンドを実行します。
cd ..
tar -xzvf dbi-0.1.1.tar.gz
cd ruby-dbi
ruby setup.rb config --with=dbi
ruby setup.rp setup
ruby setup.rb install
|
| 10.
|
Railsとその依存性をローカルにインストールするには、次のコマンドを実行します。
cd ..
gem install activesupport-1.4.2.gem
gem install actionpack-1.13.3.gem
gem install active record-1.15.3.gem
gem install actionwebservice-1.2.3.gem
gem install rake-0.7.3.gem
gem install actionmailer-1.3.3.gem
gem install rails-1.2.3.gem
http://gems.robyforge.orgからリモートのgemにアクセスできる場合、次のコマンドを実行してRailsとその依存性をリモート・インストールできます。 gemファイルを手動でダウンロードする必要がないため、これは非常に効率的です。
gem install rails --include-dependencies
|
トピック・リストに戻る
このアイコンの上にカーソルを置くと、すべてのスクリーンショットが非表示になります。
|