カスタマイズしたジェネレータcondition_scaffoldの起動方法
画面からの起動
カスタマイズしたジェネレータであるcondition_scaffoldを、図1のように画面から起動できるようにします。
condition_scaffoldは、モデルクラスを元にアプリケーションを生成するので、「#{RAILS_ROOT}/app/models」配下にあるクラスを一覧で画面に表示し、選択できるようにしています。
そのためのコードを下記に示します。
<ul>
<%
require "find"
<%#【1】 %>
Find.find("#{RAILS_ROOT}/app/models") { |path|
element = path.split("/")
model_name = element.pop
if model_name =~ /.rb/
model_name2 = model_name.split(".rb")
model_name3 = model_name2[0].split("_")
model_name4 = ""
for i in 0..model_name3.length
<%#【2】 %>
model_name4 += model_name3[i].to_s.capitalize
end
%>
<%
model_klass = Module.const_get(model_name4)
unless model_klass == GlobalEnvironment
%>
<%#【3】 %>
<li>
<%= link_to "#{model_name4}",
:action=>'column_list', :name=>"#{model_name4}" %>
</li>
<%
end
end
%>
<% } %>
</ul>
- 【1】
Findクラスを使用して、「#{RAILS_ROOT}/app/models」配下にあるファイルを取得しています。 - 【2】取得したファイル名をクラス名に変換し、「model_name4」に格納しています。
- 【3】リンクタグを生成しています。
図1で任意のリンク(例えば、MstHinmoku)をクリックすると、図2の画面へ遷移します。
MstHinmokuモデルクラスやテーブルは、「Flash CS3とRoRで構築する業務アプリケーション 第2回」で作成したものを使用します。
図2の画面では検索条件となる列名を指定します。
<%# 【1】 %>
<% form_tag :action => 'generate' do %>
<%# 【2】 %>
<%= hidden_field "moderu", "klass", :value=>@model_klass %>
<table>
<% for column in @model_klass.columns %>
<tr>
<%# 【3】 %>
<td>
<%= check_box "retrieval", "#{column.name}" %>
<%= column.name %>
</td>
</tr>
<% end %>
</table>
<br />
<%= submit_tag "生成", :name=>@model_klass %>
<% end %>
- 【1】生成ボタン押下時にアクションクラスの
generateアクションを呼び出します。 - 【2】
hidden_fieldで、モデルクラス名をgenerateアクションに対して渡します。 - 【3】チェックボックスタグを生成しています。生成ボタンを押下すると、下記のコントローラの
generateアクションを呼び出し、condition_scaffoldを起動します。
起動後、図3の画面へ遷移します。
class ConditionScaffoldController < ApplicationController
def file_list
end
def column_list
@model_klass = Module.const_get(params[:name])
end
#-------------------------------------------------------------
# ConditionScaffold を使用して、アプリケーションの生成を行います。
#-------------------------------------------------------------
def generate
@model_klass = Module.const_get(params[:moderu][:klass])
hikisu = ""
for column in @model_klass.columns
if params[:retrieval][:"#{column.name}"] == "1"
hikisu += column.name + " "
end
end
# 【1】
generation_output = `ruby script/generate condition_scaffold --skip #{params[:moderu][:klass]} #{params[:moderu][:klass]}s #{hikisu}`
print generation_output
# 【2】
params[:generation_output] = generation_output
render :action=>'result'
end
def result
end
end
- 【1】
condition_scaffoldを起動します。 - 【2】起動結果を「
params[:generation_output]」変数へ保存します。
この変数は図3で結果を表示するために使用されます。
生成されたアプリケーション
生成されたアプリケーションの画面を図4~図6に示します。
図4では、検索条件が入力できます。
図5では、フォーカスアウト時に「梱包計画品」という名称が表示されています。
図6では、部品識別IDや手配区分IDの値をマスタから引き当て、名称を表示しています。
まとめ
本稿では、Ruby on RailsのScaffoldをカスタマイズする方法を解説しました。本稿で加えた変更は、検索条件や入力チェック、フォーカスアウト時のマスタアクセスなど、一般的にユーザーが欲しがる機能に対するものです。本稿をベースにカスタマイズをさらに加えていけば、もっと機能が高いScaffoldを作成することができると思います。
参考資料
- 『JavaScript&DHTMLクックブック』 Danny Goodman 著、村上列 訳、2004年1月、オライリージャパン






