Ext Scaffold Generator Pluginを使う

管理機能などのCRUD画面で使用できるscaffoldジェネレータを探していたところ、extjsを使用したscaffoldジェネレータを見つけました。
http://inside.glnetworks.de/2008/01/18/announcing-ext-scaffold-generator-plugin-for-rails/
以下は、検証した記録です。

インストール

Ext Scaffold Generator Pluginは、Rails Version 2.0 以上が必要です。
1.2.x以前のバージョンの場合、予め、gem update railsを実行します。

  1. ext-2の配布ファイル(2008/02/27時点最新版:ext-2.0.1.zip)をダウンロード:http://extjs.com/deploy/ext-2.0.1.zip
  2. $rails_app/public/配下にextディレクトリ作成。
  3. ダウンロードしたext-2.0.1.zipを作成したextディレクトリに展開。
  4. $rails_appディレクトリでscript/pluginを実行します。
$ script/plugin install http://rug-b.rubyforge.org/svn/ext_scaffold

以上でインストール完了です。

ext_scaffoldジェネレータを使う

空のMVCを作成する

"script/generate ext_scaffold ModelName"を実行すると、モデルのMVC作成されます。

$ script/generate ext_scaffold Hoge
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/hoges
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  public/images/ext_scaffold
      create  app/views/hoges/index.html.erb
      create  app/views/hoges/show.html.erb
      create  app/views/hoges/new.html.erb
      create  app/views/hoges/edit.html.erb
      create  app/views/hoges/_form_items.html.erb
      create  app/views/layouts/hoges.html.erb
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/hoge.rb
      create    test/unit/hoge_test.rb
      create    test/fixtures/hoges.yml
      exists    db/migrate
      create    db/migrate/001_create_hoges.rb
      create  app/controllers/hoges_controller.rb
      create  test/functional/hoges_controller_test.rb
      create  app/helpers/hoges_helper.rb
       route  map.resources :hoges

通常のscaffoldジェネレータと違い、modelも作成されます。
CRUD用viewファイルは作成されますが、モデルのフィールド定義がないため、Newアクションを実行しても新規作成画面は何も表示できません。
Viewの一覧もID列しか表示されないようです。

このため、一覧の列定義、入力フィールド等は、"app/views/hoges/index.html.erb"、"app/views/hoges/_form_items.html.erb"に記述します。

一覧の列項目/入力項目を指定してext_scaffoldを実行する

「空のMVCを作成する」で実行した場合、一覧の列項目や入力項目が追加されないため、そのまま管理画面で使用できません。
管理画面で使える様にするためにext_scaffoldジェネレータ実行時に表示/編集する項目を設定します。
+ 書式: script/generate ext_scaffold User field_name:データ型[, field_name:データ型, ...]


"script/generate ext_scaffold DataModel name:string"様にに実行すると、一覧にID列とName列が表示され、新規作成画面では、Nameを入力できる様になります。以下は、Fugaモデルに、nameカラムを追加してext_scaffoldを実行しています。

$ script/generate ext_scaffold Fuga name:string
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/fugas
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  public/images/ext_scaffold
      create  app/views/fugas/index.html.erb
      create  app/views/fugas/show.html.erb
      create  app/views/fugas/new.html.erb
      create  app/views/fugas/edit.html.erb
      create  app/views/fugas/_form_items.html.erb
      create  app/views/layouts/fugas.html.erb
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/fuga.rb
      create    test/unit/fuga_test.rb
      create    test/fixtures/fugas.yml
      exists    db/migrate
      create    db/migrate/002_create_fugas.rb
      create  app/controllers/fugas_controller.rb
      create  test/functional/fugas_controller_test.rb
      create  app/helpers/fugas_helper.rb
       route  map.resources :fugas

この処理で"db/migrate/002_create_fugas.rb"に:nameカラムが追加されます。
ただし、現在のバージョンでは、データ型定義以外の制約は設定できなため、必要な制約は、migrateファイルに記述します。
ext_scaffoldジェネレータを実行後、"rake db:migrate"を実行します。。

$ rake db:migrate
(in /Users/maxy/repos/rails_sandbox)
== 3 CreateFugas: migrating ===================================================
-- create_table(:fugas)
   -> 0.0027s
== 3 CreateFugas: migrated (0.0030s) ==
========================================

rake実行後、サーバを起動します。http://localhost:3000/fugas/へアセスすると、ID/Nameカラムが表示されます。

Newボタンクリックすると新規作成画面が表示されます。Nameの入力が行えます。

日本語による入力も問題ないようです。

Editボタンをクリックすると、編集画面が表示されます。
また、Deleteボタンによる選択行の削除、Search欄からの検索なども実行できます。

気がついた点

Ext Scaffold Generator Pluginは、まだ公開された直後らしく安定した動作をしていない点がみられました。

  1. モデルが存在する状態でgenerateを実行すると、Controllerが作成できない。
  2. script/generate ext_scaffold 実行時にmodelのカラムを指定した場合に、指定したデータ型で作成されない場合がある。

今回は時間が無かったため、各問題の解決方法まで調査できませんでした。
時間があるときに調査してみたいです。

ps. Dojoベースのscaffoldジェネレータとかあると便利そう。作ってみるか...