2010年10月25日月曜日

devise emailなしの認証をやってみる

というわけで実証してみる。blogに何でもやってみたことを書きつけておくと、本当に便利だな。(^^;)すぐ忘れてしまうから、以前のdeviseがらみの自分の書いたものが思い出す役に立った。だから今回も、詳しい人にしてみたらアホみたいなことまでちゃんと書いておくことにする。
deviseインストール
email_required? は現行のdevise1.1.3では使えない。githubのソースからgemをインストールする必要がある。
gem 'devise',:git=>'http://github.com/plataformatec/devise.git'
をGemfileに記述する。
bundle installした後は、いつもの
rails g devise:install
installしたあと、environments/development.rbに
config.action_mailer.default_url_options = { :host => 'localhost:3000' }

routs.rbに
root :to=>ほげ
を記述すること、レイアアウトファイルに

<%= notice %>

<%= alert %>

を記述すること、をdeviseが注意してくるのでそのとおり実行。
user生成
rails g devise user

でuserを生成。この時点でのmigrateファイルはこんな感じ。
class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable
      t.string :name

      t.timestamps
    end

    add_index :users, :name,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
  end

  def self.down
    drop_table :users
  end
end
emailのかわりに:nameを認証に使うのでそれを追加。
add_index :users, :name, :unique => true
もemailの代わりに記述する。ここで
add_index :users, :email, :unique => true
を残しておくと、せっかくemailなしでuserを作れてもデータベースにsaveするときsplite3にはねられてしまう。(とえらそうに書いているのは、その失敗を実際にやってしまったから(^^;))

userのmodel。
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me,:name
  validates :name,:presence=>true,:length=>{:maximum=>20}
  validates_presence_of :email, :if => :email_required?
  
  def email_required?
    false
  end
end
email_required?をfalseにしておくことでemailなしの認証を可能にする。

devise調整
initializers/devise.rbをいくつか編集する。
23行目、
config.authentication_keys = [ :name ]
emailから:nameに変更。
46行目、
config.encryptor = :bcrypt
をコメントアウト。これはコメントアウトしないままでサーバを起動したら注意されるので。
110行目、
config.scoped_views = true
これはコメントをはずして有効にする。これでviewをカスタマイズできるようになるので、
rails g devise:views users
として、user用のviewを生成する、

これでemailを入力しないでレジストできるようになる、はず。何か書き忘れたことがあるかも・・。

0 件のコメント:

コメントを投稿