:token_authenticatableが削除されたので他の方法で実装してみた

4月1日ですが、エイプリルフールエントリーではないので、ご安心を!
桜がきれいに咲いて、『RailsiPhoneではじめるアプリケーション開発』で疲れた私の心を癒してくれましたw

今回は、こちらのエントリの補足です。
『RailsとiPhoneではじめるアプリケーション開発』を進める時の注意点・ハマったこと Chapter 010 - diceK66のブログ

タイトル通り、:token_authenticatableが新しいdeviseでは削除されているので、他の方法で実装してみました。

Userテーブルにauthentication_tokenカラムを追加

$ rails g migration AddAuthenticationTokenToUser authentication_token:string

migrationファイルを編集

追加したauthentication_tokenカラムにユニークインデックスをはっておきます。

class AddAuthenticationTokenToUser < ActiveRecord::Migration
  def change
    add_column :users, :authentication_token, :string
    add_index :users, :authentication_token, unique: true #ここを追記
  end
end

DBに反映

いつものコマンドでDBに反映します。

$ rake db:migrate

application_controller.rbを修正

おそらく、現時点ではほぼ空になっているはずですが、以下のようにコードを追記します。
翻訳は適当ですのでご勘弁をw

class ApplicationController < ActionController::Base
  protect_from_forgery

  # これはDeviseのauthenticate_user!メソッドが呼ばれる前に呼び出される独自メソッドです。
  before_filter :authenticate_user_from_token!
  # こちらがDeviseのメソッドです
  before_filter :authenticate_user!
 
  private
  def authenticate_user_from_token!
    user_email = params[:user][:email].presence
    user       = user_email && User.find_by_email(user_email)
 
    # タイミング攻撃を防ぎつつ、paramsのトークンとDBのトークンを比較します
    if user && Devise.secure_compare(user.authentication_token, params[:user][:auth_token])
      sign_in user, store: false
    end
  end
end

userモデルにメソッドを追記

これだけだとカラムが追加されているだけなので、models/user.rb必要なメソッドを追加します。

(略)
  def reset_authentication_token!
    self.authentication_token = generate_authentication_token
    save
  end

  private
  def generate_authentication_token
    loop do
      token = Devise.friendly_token
      break token unless User.where(authentication_token: token).first
    end
  end
end

以上で、正常にログインできるようになったと思います。

たまには桜でも見てリフレッシュするといい事ありますね!