グループは、ユーザーが自由に作成できるという点が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
新規作成画面の表示のソースコードは、実質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 %> 〜〜後略〜〜
新規作成画面と編集画面で、表示は同じ画面部品を使うのですが、呼び出すアクションは新規作成か更新という異なるものを呼び出す必要があるため、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
こちらも非常にシンプルで、新規作成の保存に成功した場合、グループのサマリ画面へのリダイレクトを行います。
グループ情報の編集と削除は、グループのサマリ画面にある「管理」のタブから行えます。表示する内容は、共通化された前述の新規作成と同じ画面ですので割愛します。アクションの位置は、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
更新処理(def update)は、シンプルに情報の更新をしているだけです。削除処理(def destroy)では、グループ機能の仕様として、管理者以外の参加者がいる場合は削除ができないようにしています。削除に成功した場合、groups_controllerのindexにリダイレクトしています。
今回は第1回ということで、最もシンプルな機能から見ていきました。コードリーディングをする題材が、今回のSKIPのように、ある程度完成された状態のソースコードの場合、ファイルを片っ端から読んでいくのは非常につらいものがあります。その場合、実際に動いている動作と合わせて、その動きの裏側を見ていくようにすると、実際の動きと連動することで理解が進みます。
また、Railsのようなフレームワークを採用した場合、ある程度の前提知識が共有化されるため、同じフレームワークを採用したアプリケーションであれば、読みやすいという利点があります。
次回以降、よりディープな部分のソースコードを見ていくことになります。OpenIDへの対応や、全文検索エンジンであるHyperEstraierと連動する部分なども紹介していきます。
Copyright © ITmedia, Inc. All Rights Reserved.