連載
» 2008年09月26日 00時00分 公開

Railsコードリーディング〜scaffoldのその先へ〜(1):コードリーディングを始めよう (3/3)

[倉貫 義人, 松村 章弘,TIS株式会社 技術本部 基盤技術センタ]
前のページへ 1|2|3       

グループの新規作成

 グループは、ユーザーが自由に作成できるという点がSNSの特徴です。グループの一覧表示の画面で、上部の「グループの新規作成」から行えます。こちらも一覧のときと同様に、URLの「/groups/new」から、groups_controllerのnewメソッドを見ればいいことが分かります。

01   def new
02     @group = Group.new 
03     render(:partial => "group/form", :layout => 'layout', :locals => { :action_value => 'create', :submit_value => '作成' } ) 
04   end
   app/controllers/groups_controller.rb

 新規作成画面の表示のソースコードは、実質2行と非常にシンプルです。2行目で新規に作成するグループの変数を用意して、3行目で指定の画面をレンダリングするようにしています。

 先ほどのindexメソッドとの違いは、対応するビューのファイルを用意していないことです。新規作成時に使う画面は、グループの情報の編集画面とほぼ同じなので共通化しています。そこで、コントローラからrenderメソッドを使い、画面部品の表示を行うようにしています。

 前述のビューからの使い方との違いは、「:layout =>」の指定で、画面レイアウトの指定をしている点です。こうすることで画面部品を画面全体の表示に使うことができます。

 共通化された画面部品のソースコードも眺めてみましょう。

01 <% action_value ||= "" %>
02 <% submit_value ||= "" %>
03
04 <div class="edit_form_space">
05
06 <% form_tag({:action => action_value}, :id=>'group_form') do -%>
07   <%= template_error_messages_for 'group' %>
08
09 <% if action_value != 'update' %>
10 <div class="input_line">
11   <div class="input_label">グループID</div>
12   <div class="input_value"><%= text_field 'group', 'gid', :size => 40 %></div>
13   <div class="param_desc" style="font-size:10px; color:gray;">
14   ※グループIDは4文字以上で、数字orアルファベットor記号(ハイフン「-」 アンダーバー「_」)で入力してください。<br/>
15   ※グループIDはグループを識別する文字列として、URLなどの様々な場面で使いますので、分かりやすい文字列を選んでください。
16   </div>
17 </div>
18 <% end %>
19 
 〜〜中略〜〜
20
21   <p><%= submit_tag submit_value %></p>
22 
23 <% end %>
24 </div>
25 
26 <% if action_value == 'update' %> 
27 <div class="desc" style="margin-top: 10px; padding: 5px;">
28 <%= link_to("[[削除する]]", {:action => 'destroy'},:confirm => '本当に削除しますか?', :method => :post ) %>
29 </div>
30 <% end %>
 〜〜後略〜〜
   app/views/group/_form.html.erb

 新規作成画面と編集画面で、表示は同じ画面部品を使うのですが、呼び出すアクションは新規作成か更新という異なるものを呼び出す必要があるため、6行目でアクションの指定を変数で行っています。action_valueの中身は、前述のgroup_controllerのnewメソッドの中で指定しています。新規作成時は、createアクションを呼ぶようになります。

 26〜30行目は、削除のためのリンクを表示する部分ですが、action_valueがupdateの場合、つまり、グループ情報の編集時の画面のときだけ表示するようにしています。このように、一部を書き換えて画面を共通化することもできます。

 では、新規作成のcreateが呼ばれた場合のソースコードを見ましょう。

01   def create
02     @group = Group.new(params[:group]) 
03     @group.group_participations.build(:user_id => session[:user_id], :owned => true)
04 
05     if @group.save
06       flash[:notice] = 'グループが正しく作成されました。'
07       redirect_to :controller => 'group', :action => 'show', :gid => @group.gid
08     else
09       render(:partial => "group/form", :layout => 'layout', :locals => { :action_value => 'create', :submit_value => '作成' } ) 
10     end
11   end
   app/controllers/groups_controller.rb

 こちらも非常にシンプルで、新規作成の保存に成功した場合、グループのサマリ画面へのリダイレクトを行います。

グループの編集・削除

 グループ情報の編集と削除は、グループのサマリ画面にある「管理」のタブから行えます。表示する内容は、共通化された前述の新規作成と同じ画面ですので割愛します。アクションの位置は、groups_controllerではなく、group_controllerになっています。SKIPでは、モデルの集合を扱う処理は、複数形の名前のコントローラで実装し、モデルそのものを扱う処理は単数形の名前のコントローラに集約しています。

 更新処理と削除処理のソースコードを一度に見ましょう。

01   def update
02     if @group.update_attributes(params[:group])
03       flash.now[:notice] = 'グループ情報は正しく更新されました。'
04     end
05     manage
06   end
07
08   def destroy
09     if @group.group_participations.size > 1
10       flash[:warning] = '自分以外のユーザがまだ存在しています。削除できません。
11       redirect_to :action => 'show'
12     else
13       @group.destroy
14       flash[:notice] = 'グループは削除されました。'
15       redirect_to :controller => 'groups'
16     end
17   end
   app/controllers/group_controller.rb

 更新処理(def update)は、シンプルに情報の更新をしているだけです。削除処理(def destroy)では、グループ機能の仕様として、管理者以外の参加者がいる場合は削除ができないようにしています。削除に成功した場合、groups_controllerのindexにリダイレクトしています。

実際の動作と併せてコードを読もう

 今回は第1回ということで、最もシンプルな機能から見ていきました。コードリーディングをする題材が、今回のSKIPのように、ある程度完成された状態のソースコードの場合、ファイルを片っ端から読んでいくのは非常につらいものがあります。その場合、実際に動いている動作と合わせて、その動きの裏側を見ていくようにすると、実際の動きと連動することで理解が進みます。

 また、Railsのようなフレームワークを採用した場合、ある程度の前提知識が共有化されるため、同じフレームワークを採用したアプリケーションであれば、読みやすいという利点があります。

 次回以降、よりディープな部分のソースコードを見ていくことになります。OpenIDへの対応や、全文検索エンジンであるHyperEstraierと連動する部分なども紹介していきます。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。