view__new.rhtmlのカスタマイズ
次に、新規作成ページを生成するためのテンプレートである「view__new.rhtml」を作成します。
<%%= error_messages_for '<%= singular_name %>' %>
<%
@model_klass = Module.const_get(model_name)
%>
<table class="confirm">
<% for column in @model_klass.columns %>
<%# 【1】 %>
<%
if column.name == 'created_at' or
column.name == 'updated_at' or
column.name == 'last_login_at' or
column.name == 'id'
next
end
%>
<%# 【2】 %>
<% @dict = Dictionary.find_by_english(column.name) %>
<%# 【3】 %>
<% @fout = FocusOut.find_by_check_column_name(column.name) %>
<%# 【4】 %>
<% if @fout %>
<tr id='tr_<%= @fout.check_column_name %>'>
<% else %>
<tr>
<% end %>
<%# 【5】 %>
<% if @dict %>
<th><%= @dict.japanese %></th>
<% else %>
<th><%= column.name %></th>
<% end %>
<%# 【6】 %>
<% if column.type.to_s == "string" && column.limit == 1 && /flag\z/ =~ column.name %>
<td><%%= check_box '<%= singular_name %>', '<%= column.name %>' -%></td>
<%# 【7】 %>
<% elsif column.type.to_s == "integer" %>
<% if @fout %>
<td id='<%= @fout.check_column_name %>_textbox'>
<%# 【8】 %>
<%%= text_field '<%= singular_name %>', '<%= column.name %>', :size=><%= column.limit %>, :maxlength=><%= column.limit %>, :onkeypress=>'return numeralsOnly(event)', :onblur=>remote_function(:submit=>'tr_<%= @fout.check_column_name %>', :url=>{:action=>'check_<%= @fout.check_column_name %>'}) -%>
</td>
<%# 【9】 %>
<td id='<%= @fout.reflection_name %>_label'></td>
<% else %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>', :size=><%= column.limit %>, :maxlength=><%= column.limit %>, :onkeypress=>'return numeralsOnly(event)' -%></td>
<% end %>
<%# 【10】 %>
<% elsif column.type.to_s == "string" %>
<% if column.limit < 32 %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>', :size=><%= column.limit %>, :maxlength=><%= column.limit %> -%></td>
<% else %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>' -%></td>
<% end %>
<%# 【11】 %>
<% elsif column.type.to_s == "datetime" %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>', :onchange=>"checkDate(this)", :size=>10, :maxlength=>10 -%></td>
<% else %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>' -%></td>
<% end %>
</tr>
<% end %>
</table>
- 【1】「created_at, updated_at, last_login_at, id」などの列名が新規作成ページに表示されないようにしています。
- 【2】英語表記の列名を日本語表記にするために、
Dictionaryモデルクラスを使用して、英語を日本語へ変換しています。Dictionaryの機能に関しては、「RoRのWebサービスと連携する、Adobe AIRアプリケーションの自動生成」を参考にしてください。 - 【3】フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示する任意の列名を
FocusOutモデルクラスから取得しています。 - 【4】フォーカスアウト時にAjaxで「tr」タグの情報を送るために、idを付けています。
- 【5】英語を日本語に変換できる場合は、日本語表記にしています。
- 【6】列の型がstringで、長さが1、末尾がflagの場合、チェックボックスを使用するコードを生成しています。
- 【7】列の型がintegerの場合、フォーカスアウト時の名称引当などの機能を付加したコードを生成します。
- 【8】
sizeやmaxlengthに列の長さを指定しています。onkeypressにnumeralsOnly関数を指定することで、整数のみの入力にしています。onblurにフォーカスアウト時に名称を引き当てするためのメソッドをremote_functionにて指定しています。 - 【9】引き当てた名称を表示するためのラベルを生成しています。
- 【10】型がstringで、長さが32未満の場合に
sizeやmaxlengthを指定しています。 - 【11】型が
datetimeの場合に、onchangeに対してcheckDate関数を指定することで、日付しか入力できないようにしています。
view__edit.rhtmlのカスタマイズ
次に、編集ページを生成するためのテンプレートである「view__edit.rhtml」を作成します。
<%%= error_messages_for '<%= singular_name %>' %>
<%
@model_klass = Module.const_get(model_name)
%>
<table class="confirm">
<% for column in @model_klass.columns %>
<%# 【1】 %>
<%
if column.name == 'created_at' or
column.name == 'updated_at' or
column.name == 'last_login_at'
next
end
%>
<% @dict = Dictionary.find_by_english(column.name) %>
<% @fout = FocusOut.find_by_check_column_name(column.name) %>
<% if @fout %>
<tr id='tr_<%= @fout.check_column_name %>'>
<% else %>
<tr>
<% end %>
<% if @dict %>
<th><%= @dict.japanese %></th>
<% else %>
<th><%= column.name %></th>
<% end %>
<% if column.name == 'id' %>
<td><%%=h @<%= singular_name %>.send('<%= column.name %>') %></td>
<% elsif column.type.to_s == "string" && column.limit == 1 && /flag\z/ =~ column.name %>
<td><%%= check_box '<%= singular_name %>', '<%= column.name %>' -%></td>
<% elsif column.type.to_s == "integer" %>
<% if @fout %>
<td id='<%= @fout.check_column_name %>_textbox'>
<%%= text_field '<%= singular_name %>', '<%= column.name %>', :size=><%= column.limit %>, :maxlength=><%= column.limit %>, :onkeypress=>'return numeralsOnly(event)', :onblur=>remote_function(:submit=>'tr_<%= @fout.check_column_name %>', :url=>{:action=>'check_<%= @fout.check_column_name %>'}) -%>
</td>
<%# 【9】 %>
<td id='<%= @fout.reflection_name %>_label'>
<%% if @<%= @fout.check_table_name %>_rec -%>
<%%= @<%= @fout.check_table_name %>_rec.<%= @fout.reflection_name %> -%>
<%% end -%>
</td>
<% else %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>', :size=><%= column.limit %>, :maxlength=><%= column.limit %>, :onkeypress=>'return numeralsOnly(event)' -%></td>
<% end %>
<% elsif column.type.to_s == "string" %>
<% if column.limit < 32 %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>', :size=><%= column.limit %>, :maxlength=><%= column.limit %> -%></td>
<% else %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>' -%></td>
<% end %>
<% elsif column.type.to_s == "datetime" %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>', :onchange=>"checkDate(this)", :size=>10, :maxlength=>10 -%></td>
<% else %>
<td><%%= text_field '<%= singular_name %>', '<%= column.name %>' -%></td>
<% end %>
</tr>
<% end %>
</table>
基本は、view__new.rhtmlと同様です。【1】と【9】の部分のみが異なっています。
- 【1】idを編集可能とするために、ifの中から省いています。
- 【9】編集画面のオープン時に引き当てられた名称が既に表示されるようにするためのコードを生成しています。
view_list.rhtmlのカスタマイズ
次に、一覧検索ページを生成するためのテンプレートである「view_list.rhtml」をカスタマイズします。
<%#【1】 %>
<% @dict = Dictionary.find_by_english(plural_name) %>
<div class="title" style="margin-bottom: 10px;">
<% if @dict %>
<h2><%= @dict.japanese %>の一覧</h2>
<% else %>
<h2><%= plural_name %>の一覧</h2>
<% end %>
</div>
<%#【2】 %>
<%% form_tag :action=>'list' do %>
<table class="confirm">
<% condition_columns.each do |condition_column| %>
<tr>
<% @dict = Dictionary.find_by_english(condition_column) %>
<% if @dict %>
<th><%= @dict.japanese %>(前方一致)</th>
<% else %>
<th><%= condition_column %>(前方一致)</th>
<% end %>
<td><%%= text_field_tag '<%= condition_column %>', params[:<%= condition_column %>] -%></td>
</tr>
<% end %>
<tr>
<td></td>
<td><%%= submit_tag '検索' -%></td>
</tr>
</table>
<%% end %>
<%
@model_klass = Module.const_get(model_name)
%>
<table class="confirm">
<tr>
<%#【3】 %>
<% for column in @model_klass.columns %>
<% @dict = Dictionary.find_by_english(column.name) %>
<% if @dict %>
<th><%= @dict.japanese %></th>
<% else %>
<th><%= column.name %></th>
<% end %>
<% end %>
</tr>
<%% for <%= singular_name %> in @<%= plural_name %> %>
<tr>
<% for column in @model_klass.columns %>
<%#【4】 %>
<% if column.name == 'created_at' or
column.name == 'updated_at' or
column.name == 'last_login_at' %>
<td><%%=h <%= singular_name %>.send('<%= column.name %>').strftime("%Y/%m/%d %H:%M:%S") %></td>
<% else %>
<td><%%=h <%= singular_name %>.send('<%= column.name %>') %></td>
<% end %>
<% end %>
<td><%%= link_to '参照', :action => 'show<%= suffix %>', :id => <%= singular_name %> %></td>
<td><%%= link_to '編集', :action => 'edit<%= suffix %>', :id => <%= singular_name %> %></td>
<td><%%= link_to '削除', { :action => 'destroy<%= suffix %>', :id => <%= singular_name %> }, :confirm => 'Are you sure?', :method => :post %></td>
</tr>
<%% end %>
</table>
<br />
<%%= will_paginate @<%= plural_name %> %>
<br />
<%%= link_to '新規作成', :action => 'new<%= suffix %>' %>
- 【1】タイトルを日本語表記にするために、Dictionaryモデルクラスにより英語を日本語へ変換しています。
- 【2】検索条件を入力するためのコードを生成しています。
- 【3】一覧明細のヘッダ表記を日本語へ変換しています。
- 【4】created_atやupdated_atなどの日時にかかわる列名の場合、「YYYY/MM/DD」から始まる表記にしています。
