MVCのCは

吉見和也(Kazuya Yoshimi) 2007-11-29 11:11:36

メタボリックの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が呼ばれます。

ちょっと時間がなくなってしまったので、続きは次回に

押忍

※このエントリはZDNetブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet編集部の見解・意向を示すものではありません。

SpecialPR

  • 【3/31まで早期割引受付中!】「IBM Watson Summit 2017」開催

    日本IBMが主催する最大の国内総合イベント。テクノロジー・リーダーの疑問を紐解く「企業IT、セキュリティー、モバイル、データ解析などの進化を探る」詳細はこちらから!

  • デジタル変革か?ゲームセットか?

    デジタルを駆使する破壊的なプレーヤーの出現、既存のビジネスモデルで競争力を持つ
    プレイヤーはデジタル活用による変革が迫られている。これを読めばデジタル変革の全体像がわかる!