SHOEISHA iD

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

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

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

特集記事

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

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

ジェネレータのカスタマイズコード

scaffold_generator.rbのカスタマイズ

 まず、「scaffold_generator.rb」をコピーし、「condition_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メソッドに対してカスタマイズを行います。

controller.rb
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_columnseachでループさせています。
  • 【2】検索条件のSQL文を作成します。
  • 【3】検索条件に対して指定するパラメータを作成します。「params[:<%= condition_column %>]」で画面から入力された値が分かるので、何も入力されていない場合は、「%」だけを指定して、全件検索にしています。
  • 【4】paginateで検索を行っています。

showメソッドのカスタマイズ

 次に、showメソッドに対してカスタマイズを行います。

controller.rb
#---------------------------------------------------------------
# 参照画面へ遷移するためのメソッドです。
#---------------------------------------------------------------
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メソッドに対してカスタマイズを行います。

controller.rb
#---------------------------------------------------------------
# 編集画面へ遷移するためのメソッドです。
#---------------------------------------------------------------
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】任意の列名に関して、マスタテーブルを検索して、引き当てた名称を表示するためのコードを生成しています。

フォーカスアウト時のメソッドの生成

 次に、任意の列名に関して、フォーカスアウト時にマスタテーブルを検索して、引き当てた名称を表示するメソッドを生成します。

controller.rb
<%
  @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】名称が引き当てられなかった場合のコードを生成します。

次のページ
view__new.rhtmlのカスタマイズ

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

特集記事連載記事一覧

もっと読む

この記事の著者

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー