Userのindexビューに発言用のフォームを作ったので、これを受理して発言をユーザに追加登録するコントローラを書きましょう。
まず、コントローラのひな形をgenerateします。
% script/generate controller status
そして、app/controllers/status_controller.rb を以下のように編集します。
class StatusController < ApplicationController def new if logged_in? && request.post? @status = Status.new(params[:status]) if @status if @status.status == '' redirect_to(:controller => :user, :action => 'index') return end begin current_user.statuses << @status flash[:notice] = "更新しました!" rescue flash[:notice] = @status ? @status.errors.full_messages : "エラー:更新に失敗しました。" end end end redirect_to(:controller => :user, :action => 'index') end def delete @status = params[:id] && Status.find(params[:id]) if @status && @status.user == current_user @status.destroy flash[:notice] = "削除しました!" end redirect_to(:controller => :user, :action => 'index') rescue flash[:notice] = "削除できませんでした。" redirect_to(:controller => :user, :action => 'index') end end
ついでに削除も書いておきました。「追加した」「削除した」、あるいは「できなかった」というメッセージは、先ほど追加したflashを使ってユーザにフィードバックします。
追加処理
if logged_in? && request.post?
POSTで投稿されたときのみ受け付ける。
@status = Status.new(params[:status])
フォームから発言内容を受け取って新規にStatusオブジェクトを作る。form_forを使った場合は、このようにいきなりオブジェクトとして取得できます。
current_user.statuses << @status flash[:notice] = "更新しました!"
ちゃんと中身がある場合は、現在のユーザのステータス配列に新しい発言を追加。また、flash[:notice]でユーザに追加した旨のメッセージを返します(後述)。
削除処理
@status = params[:id] && Status.find(params[:id])
idで渡された削除対象を取得。
if @status && @status.user == current_user @status.destroy flash[:notice] = "削除しました!"
発言がちゃんと存在し、発言した人がログイン中のユーザの場合のみ、該当する発言を削除。追加時と同様にflash[:notice]でユーザに追加した旨のメッセージを返します(後述)。
テスト
何かをフォームに書いて送信してみると、一覧表示に追加されるハズ。
statusesをreverseしてから表示いるので、新しいものほど上にきます。
削除は、app/views/user/index.rhtml に
<% if current_user == @user %> <%= link_to "[x]", {:controller => :status, :action => :delete, :id => s.id}, :confirm => '本当に削除しますか?' %> <% end %>