Statusコントローラを書く

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 %>

を書き加えておいて、[x] をクリックすればOKかな。link_to についてはリファレンスとかこの辺とかを見ながら。