ジェネレータのカスタマイズコード
scaffold_generator.rbのカスタマイズ
まず、「scaffold_generator.rb」をコピーし、「condition_scaffold_generator.rb」に名前を変更して、カスタマイズを行います。
# Scaffolded views.
scaffold_views.each do |action|
m.template "view_#{action}.rhtml",
File.join('app/views',
controller_class_path,
controller_file_name,
"#{action}.rhtml"),
# 【1】
:assigns => { :action => action, :condition_columns => actions }
end
# _new.rhtml
# 【2】
m.template 'view__new.rhtml',
File.join('app/views',
controller_class_path,
controller_file_name,
'_new.rhtml'),
:assings => { :condition_columns => actions }
m.template 'view__edit.rhtml',
File.join('app/views',
controller_class_path,
controller_file_name,
'_edit.rhtml'),
:assings => { :condition_columns => actions }
# Controller class, functional test, helper, and views.
m.template 'controller.rb',
File.join('app/controllers',
controller_class_path,
"#{controller_file_name}_controller.rb"),
# 【3】
:assigns => { :condition_columns => actions }
- 【1】condition_scaffoldでは、アクション引数を使用して検索条件を指定するため、「:condition_columns => actions」で検索条件を「condition_columns」に与えます。
- 【2】scaffoldでは、「new.rhtml」と「edit.rhtml」のビュー部分を「_form.rhtml」で共通化しています。今回は、それらを別々に扱いたいので、「view__new.rhtml」および「view__edit.rhtml」を作成するようにしています。
- 【3】コントローラの中で検索条件を使用する必要があるため、検索条件を「condition_columns」に与えます。
controller.rbのカスタマイズ
listメソッドのカスタマイズ
まず、listメソッドに対してカスタマイズを行います。
def list<%= suffix %>
# 検索条件
conditions = nil
<% i = 0 %>
# 【1】
<% condition_columns.each do |condition_column| %>
# 【2】
<% if i == 0 %>
conditions = ["<%= condition_column %> like ?"]
<% else %>
conditions[0] << " and <%= condition_column %> like ?"
<% end %>
# 【3】
if <%= condition_column %> = params[:<%= condition_column %>]
<%= condition_column %> = <%= condition_column %> + "%"
conditions << <%= condition_column %>
else
conditions << "%"
end
<% i = i + 1 %>
<% end %>
# 【4】
@<%= plural_name %> = <%= model_name %>.paginate \
:conditions=>conditions, \
:page=>params[:page], :per_page=>10
end
- 【1】検索条件を作成するために、
condition_columnsをeachでループさせています。 - 【2】検索条件のSQL文を作成します。
- 【3】検索条件に対して指定するパラメータを作成します。「
params[:<%= condition_column %>]」で画面から入力された値が分かるので、何も入力されていない場合は、「%」だけを指定して、全件検索にしています。 - 【4】
paginateで検索を行っています。
showメソッドのカスタマイズ
次に、showメソッドに対してカスタマイズを行います。
#---------------------------------------------------------------
# 参照画面へ遷移するためのメソッドです。
#---------------------------------------------------------------
def show<%= suffix %>
@<%= singular_name %> = <%= model_name %>.find(params[:id])
# 【1】
<%
@model_klass = Module.const_get(model_name)
for column in @model_klass.columns
if column.name == 'created_at' or
column.name == 'updated_at' or
column.name == 'last_login_at' or
column.name == 'id'
next
end
# 【2】
@fout = FocusOut.find_by_check_column_name(column.name)
%>
<% if @fout %>
# 【3】
@<%= @fout.check_table_name %>_rec = <%= @fout.check_table_name %>.find_by_id(@<%= singular_name %>.<%= column.name %>)
<% end %>
<%
end
%>
end
- 【1】新規作成画面や編集画面で、任意の列名に関して、フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示するようにした場合、参照画面でもその名称を表示するようにしなければ、つじつまが合いません。そのため、その処理を【1】以下のコードで行っています。
- 【2】フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示する任意の列名は、FocusOutモデルクラスから取得できます。
- 【3】任意の列名に関して、マスタテーブルを検索して、引き当てた名称を表示するためのコードを生成しています。
editメソッドのカスタマイズ
次に、editメソッドに対してカスタマイズを行います。
#---------------------------------------------------------------
# 編集画面へ遷移するためのメソッドです。
#---------------------------------------------------------------
def edit<%= suffix %>
@<%= singular_name %> = <%= model_name %>.find(params[:id])
# 【1】
<%
@model_klass = Module.const_get(model_name)
for column in @model_klass.columns
if column.name == 'created_at' or
column.name == 'updated_at' or
column.name == 'last_login_at' or
column.name == 'id'
next
end
# 【2】
@fout = FocusOut.find_by_check_column_name(column.name)
%>
<% if @fout %>
# 【3】
@<%= @fout.check_table_name %>_rec = <%= @fout.check_table_name %>.find_by_id(@<%= singular_name %>.<%= column.name %>)
<% end %>
<%
end
%>
end
- 【1】新規作成画面や編集画面で、任意の列名に関して、フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示するようにした場合、編集画面のオープン時に引き当てられた名称が既に表示されているようにしなければ、つじつまが合いません。そのため、その処理を以下のコードで行っています。
- 【2】フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示する任意の列名は、
FocusOutモデルクラスから取得できます。 - 【3】任意の列名に関して、マスタテーブルを検索して、引き当てた名称を表示するためのコードを生成しています。
フォーカスアウト時のメソッドの生成
次に、任意の列名に関して、フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示するメソッドを生成します。
<%
@model_klass = Module.const_get(model_name)
for column in @model_klass.columns
if column.name == 'created_at' or
column.name == 'updated_at' or
column.name == 'last_login_at' or
column.name == 'id'
next
end
# 【1】
@fout = FocusOut.find_by_check_column_name(column.name)
%>
<% if @fout %>
# 【2】
def check_<%= @fout.check_column_name %>
# 【3】
if @<%= @fout.check_table_name %>_rec = <%= @fout.check_table_name %>.find_by_id(params[:<%= singular_name %>][:<%= column.name %>])
# 【4】
render :update do |html|
html.replace_html "<%= @fout.reflection_name %>_label",
:inline=>"<label for='<%= @fout.reflection_name %>_label'>#{@<%= @fout.check_table_name %>_rec.<%= @fout.reflection_name %>}</label>"
end
else
# 【5】
render :update do |html|
html.replace_html "<%= @fout.reflection_name %>_label",
:inline=>"<label for='<%= @fout.reflection_name %>_label'>エラー</label>"
end
end
end
<% end %>
<%
end
%>
- 【1】フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示する任意の列名は、
FocusOutモデルクラスから取得できます。 - 【2】「
check_<%= @fout.check_column_name %>」の名前でメソッドを生成します。 - 【3】任意の列名に関して、マスタテーブルを検索するコードを生成します。
- 【4】マスタテーブルを検索して、引き当てた名称を表示するためのコードを生成します。
- 【5】名称が引き当てられなかった場合のコードを生成します。
