アプリケーションを無事に起動することが確認できた。それでは続けて、モデルとコントローラを作成してみよう。ここでは「product」モデルを作成する。モデル作成時に「brand」「name」「price」「quantity」「sku」の5カラムを指定した。

% rhogen model product brand,name,price,quantity,sku
Generating with model generator:
     [ADDED]  app/Product/index.erb
     [ADDED]  app/Product/edit.erb
     [ADDED]  app/Product/new.erb
     [ADDED]  app/Product/show.erb
     [ADDED]  app/Product/index.bb.erb
     [ADDED]  app/Product/edit.bb.erb
     [ADDED]  app/Product/new.bb.erb
     [ADDED]  app/Product/show.bb.erb
     [ADDED]  app/Product/product_controller.rb
     [ADDED]  app/Product/product.rb
     [ADDED]  app/test/product_spec.rb

app/Productディレクトリ以下にモデルファイル(product.rb)とコントローラファイル(product_controller.rb)、ビューファイル(*.erb)が作成された。

モデル - product.rb

# The model has already been created by the framework, and extends Rhom::RhomObject
# You can add more methods here
class Product
  include Rhom::PropertyBag

  #add model specifc code here
end

コントローラ - product_controller.rb

require 'rho/rhocontroller'
require 'helpers/browser_helper'

class ProductController < Rho::RhoController
  include BrowserHelper

  #GET /Product
  def index
    @products = Product.find(:all)
    render
  end

  # GET /Product/{1}
  def show
    @product = Product.find(@params['id'])
    if @product
      render :action => :show
    else
      redirect :action => :index
    end
  end

  # GET /Product/new
  def new
    @product = Product.new
    render :action => :new
  end

  # GET /Product/{1}/edit
  def edit
    @product = Product.find(@params['id'])
    if @product
      render :action => :edit
    else
      redirect :action => :index
    end
  end

  # POST /Product/create
  def create
    @product = Product.new(@params['product'])
    @product.save
    redirect :action => :index
  end

  # POST /Product/{1}/update
  def update
    @product = Product.find(@params['id'])
    @product.update_attributes(@params['product']) if @product
    redirect :action => :index
  end

  # POST /Product/{1}/delete
  def delete
    @product = Product.find(@params['id'])
    @product.destroy if @product
    redirect :action => :index
  end
end

ビュー - index.erb

<div id="pageTitle">
    <h1>Products</h1>
</div>

<div id="toolbar">
    <div id="leftItem" class="regularButton"><%= link_to "Home", Rho::RhoConfig.start_path %></div>
    <div id="rightItem" class="regularButton"><%= link_to "New", :controller => :Product, :action => :new %></div>
</div>

<div id="content">
    <ul>
        <% @products.each do |obj| %>

            <li>
                <a href="<%= url_for :action => :show, :id => obj.object %>">
                    <span class="title"><%= obj.brand %></span>
                    <span class="disclosure_indicator"></span>
                </a>
            </li>

        <% end %>
    </ul>
</div>

rhogenでモデルを作成できたら、ホーム画面からリンクを貼ってみる。app/index.erbの「Add Links Here...」を変更し、Productへのリンクを貼る。

% diff -u index.erb.orig index.erb
--- index.erb.orig      2010-07-09 17:02:17.000000000 +0900
+++ index.erb   2010-07-09 17:02:36.000000000 +0900
@@ -14,10 +14,10 @@
 <div id="content">
     <ul>
         <li>
-            <a href="#">
-                <span class="title">Add Links Here...</span>
+            <a href="Product">
+                <span class="title">Products</span>
                 <span class="disclosure_indicator"></span>
             </a>
         </li>
     </ul>
-</div>
\ No newline at end of file
+</div>

さきほどと同様の手順で、iPhone/Android用のアプリケーションをビルドし、各エミュレータ上で動作を確認する。

index.erbに追加したリンクが表示されている

Productsの一覧画面(Product/index.erb)。まだデータを登録していないので、表示されるレコードはなし。右上部の「New」ボタンから新規登録画面へ移動する

Productsの登録画面(Product/new.erb)

データを登録すると、一覧画面に追加したレコードが見えるようになっている

Productsの詳細画面(Product/view.erb)。右上の「Edit」ボタンから変更画面へ移動する

ホーム画面が表示されずにNot Foundと出たり、おかしな動作をするときはいったんrake cleanを実行してみよう。

RhodesでiPhone/Androidのネイティブアプリケーションを動作させてみるところまでを紹介した。1ソースをベースに複数スマートフォンのネイティブアプリを作れるのはなかなか快感だ。公式サイトのDocsにはチュートリアルやテクニカルFAQなどの情報も充実している。コードを見ながら、実装を追ってみるのも良し。興味がある方はユーザ登録をおこなって、リファレンスをもとに、エミュレータや実機でいろいろ試してみてはいかがだろうか。