2008-11-22 Railsで作るTwitterもどき(3)
■[Rails] Railsで作るTwitterもどき(下準備編2)
これまでの流れ:
Railsで作るTwitterもどき モデル設計他
コントローラの実装に入る前に、一応下準備。
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
これで最低限の準備はできた。
コントローラ編へ続く。