メタボリックのC
前回モデルを作ったので、データベースへのアクセスが出来る様になっています。それをブラウザから送られてくるリクエストで操作できるようにするのが今回説明するコントローラーです。
Toytter作成の流れ
| 残り時間 |
動画の時間 |
内容 |
| 07:00 | 03:15 | account_controller.rb編集 |
| 06:47 | 03:28 | application.rb編集 |
| 06:37 | 03:38 | user_controller.rb編集 |
| 06:23 | 03:52 | homeアクション作成 |
| 05:28 | 04:47 | showアクション作成 |
| 04:38 | 05:37 | updateアクション作成 |
| 04:12 | 06:03 | addアクション作成 |
| 03:33 | 06:42 | friend?メソッド作成 |
タイムラインでいうと、ここらへんの部分ですね。
■account_controller.rb編集
# Be sure to include AuthenticationSystem in Application Controller instead
include AuthenticatedSystem
# If you want "remember me" functionality, add this before_filter to Application Controller
before_filter :login_from_cookie
冒頭にこんなのが書いてあるので、コメントに従ってこれをApplicationControllerに移します。なので選択してcutしておきます。
ついでに、ログイン後に飛ばされるページが/accountになってるので、
redirect_back_or_default(:controller => '/account', :action => 'index')
という行を
redirect_back_or_default(:controller => '/', :action => 'index')
に書き換えます。
3カ所あるので動画内では一括置換してます。
■application.rb編集
さっきcutしておいたものを、この中に貼付けます。class~endの間ならどこでもいいです。
■user_controller.rb編集
そして実際にユーザーが書き込んだり、友達を追加したりする処理をここに書きます。これらは別の機能なので、実際にはそれぞれにコントローラーを作るんですが、動画では簡素化のために全てここに書いてしまっています。これを実際の開発でやってしまうと恐ろしいことになるので注意です。
before_filter :login_required
helper_method :friend?
before_filterはアクションが実行される前に実行されるメソッドです。ここではacts_as_authenticatedで定義されているlogin_requiredを呼び出しています。これにより、ログインしないでこのコントローラーのアクションにアクセスすると、ログインページに飛ばされることになります。
helper_methodでは、後に記述するfriend?メソッドを、コントローラー内だけでなく、viewでも使えるようにしています。
■homeアクション作成
def home
@user = current_user
@statuses = Status.find(:all, :conditions => {:user_id=>@user.friends.map(&:id)<<@user.id}, :include => :user, :order => "created_on desc", :limit => 50)
render :action => "show"
end
そして、ユーザーのマイページがこれです。ログインしている状態でhttp://host/でアクセスされると、これが実行されます。なんでこれが実行されるのかは、routes.rbで定義してるからですね。
@がつく変数は、後でview内で使用することができます。current_userはacts_as_authenticatedのメソッドで、現在ログインしているユーザーのモデルを返します。自分のページと他人のページで、同じviewファイルを使いたいので、view側で自分なのか他人なのか判断する必要が無いように、@userに常に対象となる人が入るようにしました。
また、マイページでは自分と自分のfollowしている人達の書き込みを一覧表示させたいので、必要なオプションをつけてStatus.findして、@statusesに入れています。
そして最後にこのアクションではshow.rhtmlを使いますよと書いています。
■showアクション作成
def show
redirect_to :action => "home" if current_user.login == params[:user]
@user = User.find_by_login params[:user]
@statuses = @user.statuses.find(:all, :order => "created_on desc", :limit => 50)
end
今度は自分から見た他人のページですね。
1行目で、もし自分がこのアクションを呼んだら、homeアクションにリダイレクトしています。これいらなかったかも
homeアクションで@userには人、@statusesには表示したい書き込みが入ると約束したので、@userには対象となる人をlogin名から、@statusesにはその人が書いた書き込みのみを入れています。
このアクションはshowと名付けられているので、render :actionを指定しなくとも、show.rhtmlが呼ばれます。
ちょっと時間がなくなってしまったので、続きは次回に
押忍