SHOEISHA iD

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

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

Ruby on Rails + Curl(AD)

Ruby on Rails + Curl
Curl用Scaffoldを自作する

第3回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (5.4 KB)

curl_scaffoldジェネレータを作る

 Ruby on Railsのジェネレータは、前ページで説明したRailsのコード自身以外に、プロジェクトのlibディレクトリやホームデイレクトリ下の.rails/generatorsデイレクトリにも作れます。

 今回はホームデイレクトリ下にcurl_scaffoldデイレクトリを作り、そこにジェネレータを作ることにします。Windowsの場合はC:¥Documents and Settings¥Owner¥.rails¥generators¥curl_scaffoldなどになると思います。

 curl_scaffoldジェネレータのファイル構成は以下のようになります。各ファイルについてはこれから説明します。

curl_scaffold用start.html.erbテンプレート

 前回作ったリッチクライアント版のCRUDアプリのメインはapp/view/player/start.html.erbです。このファイルをジェネレータ用のテンプレートに変換することがcurl_scaffold作成の中での大きな仕事です。

 それでは、順番にテンプレート化していきましょう。

属性(カラム)の置き換え

 start.html.erbの中には、playersテーブルのカラムに対応した記述が多数あります。下のコードではRecordFieldの部分が各カラムに対応したフィールドの定義です。

{curl 7.0 applet}
{curl-file-attributes character-encoding = "utf8"}

{import * from CURL.IO.JSON}

{let players: RecordSet =
    {RecordSet
        {RecordFields
            {RecordField "id", caption = "id", domain = int} ,
            {RecordField "name", caption = "name", domain = String} ,
            {RecordField "team", caption = "team", domain = String} ,
            {RecordField "no", caption = "no", domain = int}  ,
            {RecordField "goal", caption = "goal", domain = int} ,
            {RecordField "assist", caption = "assist", domain = int}
        }
    }
}

 下が対応するview_start.html.erbテンプレートです。

{curl 7.0 applet}
{curl-file-attributes character-encoding = "utf8"}

{import * from CURL.IO.JSON}

{let <%= plural_name %>: RecordSet =
    {RecordSet
        {RecordFields
            {RecordField "id", caption = "id", domain = int} ,
<% for attribute in attributes -%>  
            {RecordField "<%= attribute.name %>", caption = "<%= attribute.name %>", domain = <%= attribute.curl_type %>} <%= attribute.last ? '' : ',' %>
<% end -%>
        }
    }
}

 Scaffoldジェネレータではこのカラム情報はattributesという属性(GeneratedAttributeクラスのインスタンス)の配列に入っており、nameには名前、curl_typeには型の情報が入っています。さらにlastはattributes配列の最後の要素のみがtrueになります。そのため","区切りを最後以外に付けています。

 また、playersテーブルに対応した複数形の名前はplural_nameに、単数形の名前はsingular_nameに入っているので、テーブル名に対応した変数名や関数名などを<%= ~ %>で置き換えていきます。

汎用化

 前回のstart.html.erbではカラムの表示幅などはデータの大きさによりきめ細かく指定していましたが、

{let data_list: RecordGrid =
    {RecordGrid
        width = 16cm,
        height = 6cm,
        record-source = players,
        {RecordGridColumn "id", width = 0},
        {RecordGridColumn "name", width = 5cm},
        {RecordGridColumn "team", width = 2cm},
        {RecordGridColumn "no", width = 2cm},
        {RecordGridColumn "goal", width = 3cm, halign = "right"},
        {RecordGridColumn "assist", width = 3cm, halign = "right"}
    }
}

 ジェネレータでは、このような細かい指定は無理なので無難な形で統一してしまいました。

{let data_list: RecordGrid =
    {RecordGrid
        width = <%= attributes.size * 3 %>cm,
        height = 6cm,
        record-source = <%= plural_name %>,
        {RecordGridColumn "id", width = 0},
<% for attribute in attributes -%>     
        {RecordGridColumn "<%= attribute.name %>", width = 3cm} <%= attribute.last ? '' : ',' %>
<% end -%>
    }
}

次のページ
その他のcurl_scaffold用テンプレートファイル

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
Ruby on Rails + Curl連載記事一覧

もっと読む

この記事の著者

吉田裕美(ヨシダユウミ)

有限会社 EY-Office 取締役CADのベンチャー企業でCADのコア部分や図面管理システムなどの開発に従事した後、独立しJava,Ruby,PerlでWebアプリを中心に開発してきた。現在は殆どの開発はRuby on Rails。ここ数年はソフトウェアエンジニアの教育に興味をもち、従来の知識偏重な教育ではなく現実の問題を解決できるエンジニアを育てる教育に注力している。またLisp等に関心...

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

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4167 2009/07/21 15:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング