SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

JUDEで描いたクラスをそのままRuby on Railsで動かすプラグイン

LuRuJu ~JUDEとRubyの出会い~


ダウンロード pom.jude (10.3 KB)

モデルにメソッドを追加

 これで、モデルのデータのCRUDはRails上でできるようになりましたが、カプセル化の観点でモデルにビジネスロジックを追加しようと考えるのは当然の話です。もちろん実現可能です。「RAILS_ROOT/app/models」配下にクラスごとに必要なメソッドのみを記述してください。

 例として、注文詳細に単価×個数で価格を求めるメソッドを追加してみましょう。以下の内容で「RAILS_ROOT/app/models/order_detail.rb」を作成してください。

order_detail.rb
class OrderDetail < ActiveRecord::Base
  # 価格の算出(単価×注文個数)
  def price() item.price * order_number end
end

 引き続き、script/consoleで確認してみましょう。

priceメソッドの確認
C:\workspace\pom>ruby script/console
Loading development environment.
>> air = Item.create#商品インスタンス生成
=> #<Item……文末まで省略
>> air.name = 'MacAir'      #商品の名前を設定
=> "MacAir"
>> air.price = 229800       #商品の単価を設定
=> 229800
>> air.save                 #商品を登録
=> true
>> detail = OrderDetail.new #注文詳細インスタンスを作成
=> #<OrderDetail:……文末まで省略
>> detail.item = air        #注文詳細の商品を設定
=> #<Item:……文末まで省略
>> detail.order_number = 2  #注文詳細の注文個数を設定
=> 2
>> detail.save              #注文詳細を登録
=> true
>> detail.price             #注文詳細の価格を出力
=> 459600

 うまくいきましたね! はりきって2つも購入してしまいました。

ActiveScaffoldでの画面確認

 以上で、LuRuJu on Railsの機能概要については体感できたと思います。ただ、ブラウザでの画面を見ないまま終わるのは味気ないので、ActiveScaffoldで画面を出してみましょう。

 以下のコマンドでActiveScaffoldをインストールします。

ActiveScaffoldのインストール
C:\workspace\pom>ruby script/plugin install http://activescaffold.googlecode.com/svn/tags/active_scaffold

 共通のレイアウトファイルとして、「RAILS_ROOT/app/views/layout/activescaffold.rhtml」を以下の内容で作成します。

activescaffold.rhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>My Application</title>
<%= javascript_include_tag :defaults %>
<%= active_scaffold_includes %>
</head>
<body>
<%= yield %>
</body>
</html>

 「RAILS_ROOT/app/controllers」配下にそれぞれ以下のコントローラを記述したファイルを作成します。

items_controller.rb
class ItemsController < ApplicationController
  active_scaffold :item
  layout "activescaffold"
end
members_controller.rb
class MembersController < ApplicationController
  active_scaffold :member
  layout "activescaffold"
end
order_details_controller.rb
class OrderDetailsController < ApplicationController
  active_scaffold :order_detail
  layout "activescaffold"
end
orders_controller.rb
class OrdersController < ApplicationController
  active_scaffold :order
  layout "activescaffold"
end

 以上で事前準備は完了です。Railsのサーバを起動しましょう。

ActiveScaffoldのインストール
C:\workspace\pom>ruby script/server

 ブラウザより http://localhost:3000/[モデル名の複数形] にアクセスすることで画面を確認することができます。以下、画面例になります。

ActiveScaffoldの画面例
ActiveScaffoldの画面例
応答速度に関して
 画面によってはリクエストを投げてから画面が変更されるまでの応答速度が遅い場合があります。これは、上記の画面例を見れば分かるように、一回のリクエストで必要なモデルのクラスが多い場合にクラスのロード時間がボトルネックになっているからです。本番環境で起動するなり設定パラメータconfig.cache_classesをtrueにすれば、スムーズに画面遷移するようになります。
 ただ、Webサーバを再起動せずに気持ちよく開発してもらいたいという筆者の思いに反するので、どこかのタイミングでクラスのロード時間に関しても、利用者が不快に思わない程度の性能改善を行おうと考えています。
 

LuRuJu on Railsのねらい

 モデル定義やExcelでの定義より、ソースコードやDBのDDLを自動生成する独自ツールをよく見かけます。LuRuJuの紹介で述べた話でもあり、これはこれでいいのですが、中間コードもリポジトリ管理をしなければならず同一情報の二重管理になりますし、元の定義が変更されるたび、自動生成ツールを実行する必要があるので開発のスピード感が損なわれる場合もあります。

 LuRuJu on Railsは、中間コードなしでWebアプリ実行時動的にモデルデータからクラスを生成する点がおおきなミソです。『設計と実装にまたがったDRY(Don't Repeat Yourself)』を筆者はねらっています。JUDEファイルが設計フェーズの成果物のみではなく最終的な実行モジュールの一部になるのです。

 また、これはまだ未完成ですが、Webサーバを停止せずに、JUDEファイルの修正に対し、アプリケーションやDBが動的に追随することもめざしてます。アプリケーション側は既に半分実現できていて、Railsの設定パラメータconfig.cache_classesと連動します。これにより開発環境はホットデプロイ、本番環境はコールドデプロイという切り分けができます。『モデリング = 設計 + グラフィカルなコーディング』となるのです。

 永続的データ構造なんて開発の初期段階でFIXするからそんな機能いらないんじゃないかと思う方もいるかもしれませんが、要求の絶え間ない変化、ケアレスミス(画面のこの項目がテーブルの列に反映されてなかった~~)、結合試験フェーズでの仕様の齟齬など、データ構造も開発全般に渡って修正を余儀なくされるものだと思っています。

 後は、グラフィカルに描いた図がそのまますぐアプリケーションに反映されるっておもしろいじゃん、という筆者の単純な探究心やモチベーションもあります。

おわりに

 以上、駆け足でLuRuJu、LuRuJu on Railsを紹介しましたが、雰囲気をつかむことができたでしょうか? これらツールはまだ産まれたばかりでまだまだ手のかかるおてんば娘なので、不良少女にならないようにこれからじっくり育てていくつもりです。自分のニーズに合う方がいれば、使っていただけるとうれしいです。

 要求仕様の一行とプログラムコードの一行は同じ価値があります。プログラミングは知的好奇心を満たす宝庫です。筆者も皆さんもコード一行一行に想いをこめましょう!!

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

野村 周平(ノムラ シュウヘイ)

フリープログラマプログラマとして楽しくて幸せな人生を全うすることをめざし、日夜奮闘中。アジャイル、オブジェクト指向をこよなく愛するが、最近はRubyの言語仕様に感動し惚れ込んでいる。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2377 2008/08/19 19:48

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー