Hatena::Diary

篳篥日記 このページをアンテナに追加 RSSフィード

2008-11-22 Railsで作るTwitterもどき(3)

[] Railsで作るTwitterもどき(下準備編2) 20:16  Railsで作るTwitterもどき(下準備編2) - 篳篥日記 のブックマークコメント

これまでの流れ:

Railsで作るTwitterもどき モデル設計他

Railsで作るTwitterもどき (2) URL設計


コントローラの実装に入る前に、一応下準備。

URL設計の方で http://twitter.com/ユーザ名 みたいにユーザ名をURLに入れるようにしたが、これを取り出す側の実装の説明をしたい。

ここでは、パスにユーザ名が入っていた場合に、そのユーザモデルを @user に作るようにする。


ApplicationControllerに実装する。こんな感じ。

# app/controllers/application.rb
class ApplicationController < ActionController::Base
  include AuthenticatedSystem

  helper :all # include all helpers, all the time
  helper_method :me?  # (6)

  # 中略

  protected

  # @user を設定
  def set_user
    current_user  # (1)
    if params[:user]
      if user = User.find_by_login(params[:user])  # (2)
        @user = user  # (3)
      else
        render :text => 'user not found' and return  # (4)
      end
    else
      @user = @current_user  # (5)
    end
  end

  # @userが自分かどうか
  def me?
    @user == @current_user
  end
end

まず (1) で restful_authenticationのメソッドを呼び出す(current_userはローカル変数に見えるけど実はメソッド呼び出し。Railsにはこういうものが結構ある)。これにより @current_userができる。@current_user には、いまログインしているユーザのオブジェクトが入る。

(2) で、routes.rb の指定によりコントローラに渡されたユーザ名 params[:user]で、users テーブルを引く。

もし、そのユーザ名のユーザが見つかったら、Userオブジェクトを @user に入れる (3)。

見つからなかった場合には、エラーメッセージを表示 (4)。

そもそも params[:user] が渡されなかった場合には、 @user は @current_userにする (5)。こうすることで自分のホームである /home などが呼び出された場合(params[:user] は nil になる)には、@user == @current_user となる。


ついでに @userと@current_userが同じかどうかを判別するメソッドとして、#me? を定義している。このメソッドはヘルパーで使ったりしたいので、 (6) の helper_methodの指定により、ヘルパーメソッドとしても使えるようにした。


この #set_user を、before_filterにより、ユーザIDがURLから渡されるメソッドの実行前に呼び出すと、@userがセットされる。


次に、必要なプラグインインストールを済ませておく。ページ送り(pagination)用のライブラリ will_paginateを入れる。

config/environment.rbに以下を追加。

Rails::Initializer.run do |config|
  # 略
  config.gem 'mislav-will_paginate', :version => '~> 2.3.6', :lib => 'will_paginate', :source => 'http://gems.github.com'
  # 略
end

これで、指定と requireができる。指定したプラグインインストールするには、以下のようにする。

$ rake gems:install

もし上記でうまく行かない場合には、

$ sudo gem install mislav-will_paginate --source=http://gems.github.com

インストール


あと、日付表示の際に楽ができるようにしておく。

発言などの日時を表示する際に、日本語表記にformatするが、ここで楽をしたい。

具体的には

tweet.created_at.to_s(:jp)  # --> "2008年11月22日 12時30分"

などと、to_s(:jp) で変換したい。

config/environment.rb の末尾に以下を追記。

Time::DATE_FORMATS[:jp] = "%Y年%m月%d日 %H時%M分"

これで Time#to_s(:jp) が使えるようになる。


ついでに、トップページログインページにしておこうか。

config/routes.rb を編集。

ActionController::Routing::Routes.draw do |map|
  # 略
  map.root :controller => "sessions", :action => "new"
  # 略
end

これでサイトトップにアクセスすると、/sessions/new が呼ばれる。

デフォルトトップページは要らないので削除。

$ rm public/index.html

これで最低限の準備はできた。

コントローラ編へ続く。