|
Contents |
|
Edgar の使い方を順を追って説明します。
$ cd MY_PROJECT_DIR $ rails new my_app -d postgresql $ cd my_app
$ git init $ git add . $ git commit -v
$ git clone git://jjedgar.git.sourceforge.net/gitroot/jjedgar/edgar2
追加後はお決まりの bundle install です:gem 'jquery-ui-rails' gem 'edgar', path: 'edgar2' gem 'rails-i18n' gem 'will_paginate', '~> 3.0.0' gem 'remotipart', '~> 1.0.2' gem 'bcrypt-ruby', require: "bcrypt" gem 'acts_as_tree', '~> 1.1.0' group :development do gem 'yard' gem 'rails-erd' end
$ bundle install
$ $EDITOR config/database.yml # config database
$ rake edgar_engine:install:migrations
$ rake db:create $ rake db:migrate $ rake db:setup
include Edgar::ControllerMixinForApp include Edgar::AuthenticationMixin before_filter :require_login
include EdgarHelper
//= require jquery.ui.dialog //= require jquery.ui.datepicker //= require jquery.remotipart //= require edgar/base //= require edgar/menu //= require edgar/operator_selection
*= require jquery.ui.dialog *= require jquery.ui.datepicker *= require edgar/base *= require edgar/menu
(※ 既に行った 'rake edgar_engine:install:migrations' で セッションテーブルは作成されているので、ここでの migration は必要ありません。)MyApp::Application.config.session_store :active_record_store
http://localhost:3000 にブラウザからアクセスしてみて下さい。 Rails logo のページが表示されればひとまず ok です。 何らかのエラーが表示されたり何も表示されないと言った場合は、 どこかの設定が間違っています。ひとまず立ち戻って確認してみて 下さい。$ rails server
一例として、製品マスターと注文を管理するアプリを edgar:scaffold を使って 開発することとします。ここで、'製品' 対 '注文' は '1対多' の関係に あるとします。
$ rails generate edgar:scaffold Product name:string price:integer $ rake db:migrate
$ cp edgar2/test/dummy/app/views/layouts/application.html.erb app/views/layouts/
$ cp edgar2/test/dummy/app/views/layouts/login.html.erb app/views/layouts/
ファイル中に、下記のように 'products' を追加します:$ mkdir config/edgar $ cp edgar2/test/dummy/config/edgar/menu_config.rb config/edgar/
('authors' と 'books' の行は dummy 用なので削除して下さい)module Edgar::MenuConfig def top ... 'products', '_separator', ... end
$ cp edgar2/db/seeds.rb db/ $ rake db:seed
$ cd edgar2 $ tar cvf /tmp/x.tar test/fixtures/edgar* $ cd - # 先のディレクトリ(Rails.root)に戻る $ tar xvf /tmp/x.tar # edgar2/test/fixtures/edgar* を test/fixtures/edgar* にコピー $ rake db:fixtures:load # test/fixtures/ を開発DBにロード
$ rails generate edgar:scaffold Order name:string product_id:integer quantity:integer $ rake db:migrate
module Edgar::MenuConfig def top ... 'products', 'orders', '_separator', ... end
Edgar では以下のカスタマイズをサポートしています。 簡単なレベルから複雑なレベルの順に説明します:
Rails の 'migration' 機能を使うことで、任意の数のカラムを追加することができます (ただし DB の制限の範囲内で)。 追加したカラムは自動的に一覧表示・フォーム画面・検索画面に表示されます (もちろん、カラムを表示する・しないは、一覧・フォーム・ 検索フォームそれぞれにおいて制御することもできます)。
例として、Customer モデルの name カラムを first_name, last_name に変更する方法を示します:
$ rails generate migration change_name_of_customers $ vi db/migrate/YYYYMMDDNNNNNN_change_name_of_customers.rb # 実際に生成されたファイル名を使用して下さい
class ChangeNameOfCustomers < ActiveRecord::Migration def up remove_column :customers, :name add_column :customers, :first_name, :string add_column :customers, :last_name, :string end def down add_column :customers, :name, :string remove_column :customers, :first_name remove_column :customers, :last_name end end
$ rake db:migrate
注: 現時点で first_name, last_name には空のデータが入っているため、 nil の場合は '?' を表示するようにしています。 必須項目の場合、単純に first_name + ' ' + last_name とできるでしょう。class Customer < ActiveRecord::Base : validates_presence_of :first_name, :last_name : def name (first_name || '?') + ' ' + (last_name || '?') end end
もし今の Edgar の Webデザインが気に入らないなら(承知しています。^^;)、 テンプレートやスタイルシートを変更することで対応可能です。 app/views/ 及び app/assets/stylesheets/ のファイルを変更してください。
edgar:scaffold で生成したモデル・ビュー・コントローラは自由にカスタマイズできます。 この節では、表示項目を制限したり表示順を指定する方法について説明します。 それ以上の動作(計算値を表示する・専用のUIを使う等)を望む場合は次節以降を参照下さい。
edgar:scaffold 実行直後の画面をご覧になると分かると思いますが、 一覧・フォーム・検索フォーム・選択ポップアップ(他からbelongs_toで参照されている場合)に、 すべてのカラムが表示されています(*)。 時としてこれは多すぎることがあります。 また、この段階では表示順は DB の仕様で勝手に決められてしまっていますが、 これを指定したい場合があります。 Edgar ではこのレベルのカスタマイズを行う簡単な方法を提供します。
(*)正確には、フォームでは id, created_at, updated_at は表示されません。
カラム名からなる文字列配列を返す view_columns() クラスメソッドを再定義することで、 モデルの表示項目と表示順を指定することができます。例:
class Product < ActiveRecord::Base : def self.view_columns %w(id name) end : end
EdgarController では、一覧・フォーム・検索フォーム・ポップアップ用一覧の、 計4つの "画面部品" を制御しています。 これら画面部品ごとに表示項目を指定したい場合、 モデルに以下のクラスメソッドを定義します:
返す値は view_columns() と同様、カラム名文字列の配列です。 ユーザモデルの例を示しましょう:
class User < ActiveRecord::Base : # AR::Base.view_list_columns() を上書きする def self.view_list_columns %w(id login email created_at updated_at) end : end
view_columns() がモデルに対して4つの画面部品共通の表示項目を定義するのに対し、 これら4つのメソッドは画面部品ごとの表示項目を定義します。 これら計5つのメソッドは、組み合わせて使用することができます。 優先順は、画面部品ごとのメソッドが優先されます。 従って、以下の順に設計するのがよいでしょう:
カスタマイズ後は、プログラムが問題ないか以下で確認して下さい:
$ rake test
画面のレイアウトを変えたい・専用の UI を使いたい・ 計算結果をリアルタイムに画面に出したい、という場合、 上記のカスタマイズでは対応できません。
ここでは、EdgarController (及びその派生クラス --edgar:scaffold で生成したコントローラが当てはまります) の範囲内で view をカスタマイズするケースについて説明します。
edgar:scaffold は view を生成しませんが、それは、 デフォルトで EdgarController の view を使用するためです (Rails 3 の素晴らしい機能のおかげです)。EdgarController では 下記のテンプレートを使用しています:
edgar/_form.html.erb: | フォーム |
edgar/_list.html.erb: | 一覧 |
edgar/_search_form.html.erb: | 検索フォーム |
edgar/index.html.erb: | 全体表示 |
それぞれ、各コントローラにて上書きすることが可能です。 次節にて例を示します。
例として、製品モデルのフォームをカスタマイズすることにします。 app/views/products/_form.html.erb を作成することで、自動的に こちらのテンプレートが使用されます. 例えば、下記のようにテキストフィールドを明示的に 表形式で表示する、ということが可能です:
... <%= edgar_form do |f| %> <%= draw_form_buttons %> <table> <tr><th>Name</th> <td><%= f.text_field :name %></td></tr> <tr><th>Price</th> <td><%= f.text_field :price %></td></tr> </table> <% end %> ...
単に view テンプレートをカスタマイズするだけでは不十分な場合があります。 その場合は、コントローラにアクションを追加する必要がある場合があることでしょう。 これは通常のコントローラへのアクションの追加と同様です。
EdgarController の提供する機能をほとんど使用しない場合、 EdgarController からの継承を止めて ActionController::Base から継承し、 通常のコントローラ開発の手順を踏みます。これは最後の手段です。 カスタマイズというより、Rails フレームワークにおける追加開発と言えます。
edgar:scaffold は機能テスト(functional test)と単体テスト(unit test) も生成します。 単体テストは素の scaffold と同じものですが、機能テストは EdgarController 用に大きく修正されており、Edgar用テストヘルパとEdgar用フィクスチャにも 依存しているため、以下のような準備が必要になります:
group :test do gem 'shoulda-context' end
require 'shoulda-context' Dir[Rails.root + 'edgar2/test/support/**/*.rb'].each { |f| require f }
class ActiveSupport::TestCase include Edgar::ControllerSupporter ...
$ cd edgar2 $ tar cvf /tmp/x.tar test/fixtures/edgar* $ cd - # 先のディレクトリ(Rails.root)に戻る $ tar xvf /tmp/x.tar # edgar2/test/fixtures/edgar* を test/fixtures/edgar* にコピー
set_fixture_class edgar_view_status: 'Edgar::ViewStatus'
ENV["RAILS_ENV"] = "test" require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require 'shoulda-context' Dir[Rails.root + 'edgar2/test/support/**/*.rb'].each { |f| require f } class ActiveSupport::TestCase include Edgar::ControllerSupporter fixtures :all set_fixture_class edgar_view_status: 'Edgar::ViewStatus' end
$ rake test