今回は,これまで作ってきたフォロー/リムーブの仕組みなどを実際に組み込んで,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と参照できるようになります。

