アンケートの選択肢を作る場合は、先ほどと同様に「Generators」タブで「Item Admin::Items」と入力すれば、管理画面が表示されるようになります。しかし、これでは選択肢とアンケート自体の結びつきがありません。そこで、モデルクラスに変更を加えます。
まず、画面左側にある「RadRails Navigator」タブで、app/models/enquete.rbを開き、
class Enquete < ActiveRecord::Base
has_many :items
end
のように追加します。同様に、app/modes/items.rbにも、
class Item < ActiveRecord::Base
belongs_to :enquete
end
のように追加します。これによって、EnqueteとItemを関連づけることができました。
続いて、選択肢の管理画面でアンケートを選べるようにします。これは、views/admin/items/_form.rhtmlを編集し、Nameのtext_fieldの下にリスト2のような2行を付け加えます。これによって、アンケートが選べるようになります(図10)。
<p><label for="item_enquete_id">enquete</label><br/>
<%= select("item", "enquete_id", Enquete.find_all.collect {|e| [ e.title, e.id ] }) %></p>
実際の投票画面は、専用の新しいコントローラーVoteControllerを作成します。ここではすでにモデルが存在するので、scaffoldではなくcontrollerを使用します。「Generators」タブの左側で「controller」を選択し、右側に「Vote show vote」と入力して[Go]ボタンをクリックすると、コントローラーが生成されます。
そして、コントローラー(リスト3)とビュー(リスト4)を修正します。投票後はそのままリダイレクトで投票前の画面に戻るため、show.rhtmlと一緒に作られたvote.rhtmlは使わずそのままにしておきます。細かい説明は省きますが、rhtmlファイルがテンプレートとなります。これは、eRuby(埋め込みRuby)というフォーマットで書かれたもので、<%?%>の部分がプログラムとして実行されます。
以上の作業によって、簡単な投票フォームの完成です。
class VoteController < ApplicationController
def show
@enquete = Enquete.find(params[:id], :include=>[:items])
end
def vote
@enquete = Enquete.find(params[:id])
if !params[:id] || !params[:item] || !params[:item][:id]
flash[:notice] = '選択してください'
redirect_to :action => 'show', :id => @enquete
return
end
@item = Item.find(params[:item][:id])
if !@item
flash[:notice] = '不正な入力です'
redirect_to :action => 'show', :id => @enquete
return
end
@item.count = @item.count.to_i + 1
if @item.save
flash[:notice] = '投票を受け付けました'
redirect_to :action => 'show', :id => @enquete
else
render :action => 'show'
end
end
end
<html>
<head>
<title> <%=h @enquete.title %></title>
<%= stylesheet_link_tag 'scaffold' %>
</head>
<body>
<b><%=h @enquete.title %></b>
<p style="color: green"><%= flash[:notice] %></p>
<%= start_form_tag :action => 'vote', :id => @enquete %>
<p>
<%=h @enquete.body %>
</p>
<p>
<% for item in @enquete.items %>
<%= radio_button("item", "id", item.id ) %><%=h item.name %>(<%=h item.count.to_i%>票)<br>
<% end %>
</p>
<%= submit_tag '投票' %>
<% end_form_tag %>
</body>
</html>
ここまで、Instant RailsとRadRailsの導入法と使い方を紹介してきました。RadRailsは発展途上なこともあり、慣れたエディタの方が使いやすいというケースもあるでしょう。ただ、Railsアプリケーションの開発に挑戦するためのはじめの一歩にはなるはずです。これをきっかけに、自分の開発しやすい形を見つけてみてください。
本記事は、オープンソースマガジン2006年3月号「Ruby on Rails 1.0の世界」を再構成したものです。
Copyright © ITmedia, Inc. All Rights Reserved.