SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Ruby on RailsのScaffoldをカスタマイズして使いやすくする

Ruby on Railsをプロジェクトに適した形にカスタマイズする試み

view__new.rhtmlのカスタマイズ

 次に、新規作成ページを生成するためのテンプレートである「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】sizemaxlengthに列の長さを指定しています。onkeypressnumeralsOnly関数を指定することで、整数のみの入力にしています。onblurにフォーカスアウト時に名称を引き当てするためのメソッドをremote_functionにて指定しています。
  • 【9】引き当てた名称を表示するためのラベルを生成しています。
  • 【10】型がstringで、長さが32未満の場合にsizemaxlengthを指定しています。
  • 【11】型がdatetimeの場合に、onchangeに対してcheckDate関数を指定することで、日付しか入力できないようにしています。

view__edit.rhtmlのカスタマイズ

 次に、編集ページを生成するためのテンプレートである「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」をカスタマイズします。

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」から始まる表記にしています。

次のページ
カスタマイズしたジェネレータcondition_scaffoldの起動方法

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

ryujinseiichi(リュウジンセイイチ)

http://ryujinseiichi.sblo.jp/ RubyやAIRなどの新規技術に興味があり、研究を行っています。 最近、seasar2やBPMの研究も始めました。  

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2912 2008/09/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー