Webフレームワークの新しい波 Waves探訪記

第6回 Twの完成と拡張

この記事を読むのに必要な時間:およそ 3.5 分

今回は,これまで作ってきたフォロー/リムーブの仕組みなどを実際に組み込んで,WebアプリケーションとしてTwを完成させます。

発言一覧画面の改良

今まで「/words」で呼び出す発言一覧画面では全ユーザの全発言を表示していましたが,ここもTwitter風にするために自分の発言とフォローしている人の発言だけを表示するようにします。以下のようにtemplates/word/list.mabを修正しましょう。

自分とフォローしているユーザの発言のみを表示

@me = Tw::Models::User[:name=>request.env['REMOTE_USER']]
@users = Tw::Models::User.all
layout :default, :title=>'Tw' do
  table.tw do
    tr do
      td(:colspan=>2) do
        form :action=>'/words', :method=>'post' do
          textarea '', :name=>'word.text', :cols=>80, :class=>'words'; br
          input :type=>:hidden, :name=>'word.user_id', :value=>@me.id
          input :type=>:submit, :value=>'Update'
        end
      end
    end
    tr do
      td do
        table.contents do
          @words.each do |word|
            is_me = (word.user.name==@me.name)
            unless @me.following_users.map{|u|u.name}.include?(word.user.name) || is_me then
              next
            end
            view :word, :summary, :word=>word, :is_me=>is_me
          end
        end
      end
      td do
        table.friends do
          tr do
            th(:colspan=>2){"users"}
          end
          @users.each do |user|
            next if user.name == @me.name
            view :word, :show_user, :user=>user, :me=>@me
          end
        end
      end
    end
  end
end

自分を判別するために1行目で「@me = Tw::Models::User[:name=>request.env['REMOTE_USER']]」としています。BASIC認証がかかっているので,REMOTE_USER名を拾えば,ログイン名が分かります。全ユーザは「@users = Tw::Models::User.all」で取得します。「@words.each do |word|」以下のブロックが発言の処理部分です。個々の発言のユーザ名と自分の名前を比較して,その発言が自分のものかどうかチェックします。

その発言は自分のものかどうか?

is_me = (word.user.name==@me.name)

自分のものなら変数is_meが真になります。

その発言は自分のものもしくはフォローしている人のものか?

unless @me.following_users.map{|u|u.name}.include?(word.user.name) || is_me

フォローしているユーザの一覧は「@me.following_users」で分かるので,発言の名前と比較します。これで「自分の発言とフォローしている人の発言だけ表示する」ことができます。表示のビュー呼び出しにはis_me変数も一緒に渡しましょう。

発言を表示するビューの呼び出し

view :word, :summary, :word=>word, :is_me=>is_me

発言表示のビューを改良する

templates/word/summary.mabを以下のようにします。ここで行う主なことは,自分の発言とそれ以外では異なるcssのクラスを指定することです。

発言表示用のビュー

tr(:class=>@is_me ? 'mywords':'words') do
  td.name(:style=>'width:10%;') do
    strong do
      @word.user.name
    end
  end
  td.word do
    span.word{@word.text}
    span.date{@word.created_on.strftime("%Y-%m-%d %H:%M") if @word.created_on}
  end
end

呼ばれたビューの中のインスタンス変数は,呼び出す側で指定したものであることに注意してください。ここでは「view :word, :summary, :word=>word, :is_me=>is_me」の後半の「:word=>word, :is_me=>is_me」がそれにあたります。呼び出す側の変数wordとis_meが,呼ばれる側では@word,@is_meと参照できるようになります。

著者プロフィール

松永肇一(まつながけいいち)

株式会社ライフメディア 創造推進部プロジェクトマネージャ。東京都出身。千葉大学工学部での卒論テーマは人工知能関連だったが,富士通に入社後はPCのソフトウェア開発に関わる。"GNU for Towns"のために,リチャード・ストールマンに会いにいくような妙な仕事を経て現職。Ruby on Railsを使ってWebアプリを開発する毎日。ブログは「ma2の日記」。

URLhttp://d.hatena.ne.jp/ma2/

コメント

コメントの記入