SHOEISHA iD

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

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

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

特集記事

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

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

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

画面からの起動

 カスタマイズしたジェネレータであるcondition_scaffoldを、図1のように画面から起動できるようにします。

図1-ConditionScaffold
図1-ConditionScaffold

 condition_scaffoldは、モデルクラスを元にアプリケーションを生成するので、「#{RAILS_ROOT}/app/models」配下にあるクラスを一覧で画面に表示し、選択できるようにしています。

 そのためのコードを下記に示します。

file_list.rhtml
<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-ConditionScaffold
図2-ConditionScaffold

 図2の画面では検索条件となる列名を指定します。

column_list.rhtml
<%# 【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の画面へ遷移します。

condition_scaffold_controller.rb
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で結果を表示するために使用されます。

図3-ConditionScaffold
図3-ConditionScaffold

生成されたアプリケーション

 生成されたアプリケーションの画面を図4~図6に示します。

 図4では、検索条件が入力できます。

図4-生成された画面
図4-生成された画面

 図5では、フォーカスアウト時に「梱包計画品」という名称が表示されています。

図5-生成された画面
図5-生成された画面

 図6では、部品識別IDや手配区分IDの値をマスタから引き当て、名称を表示しています。

図6-生成された画面
図6-生成された画面

まとめ

 本稿では、Ruby on RailsのScaffoldをカスタマイズする方法を解説しました。本稿で加えた変更は、検索条件や入力チェック、フォーカスアウト時のマスタアクセスなど、一般的にユーザーが欲しがる機能に対するものです。本稿をベースにカスタマイズをさらに加えていけば、もっと機能が高い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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー