Deviseの設定手順をまとめてみた。 その4　ユーザーIDで、ログイン認証編

--- 全体の流れ ---
[その1　導入編](http://qiita.com/itboze/items/ea0d9236d89fa24a7a1c)
[その2　ViewとControllerのカスタマイズ編](http://qiita.com/itboze/items/f991d54ff527edb844d9)
[その3　Deviseの日本語化編](http://qiita.com/itboze/items/a1b532004a9a8a57e296)
[その4　ユーザーIDで、ログイン認証編](http://qiita.com/itboze/items/385d3cd539fc7578b52a) ←今ココ


Deviseって、デフォルトは、メルアドとパスワードでログイン認証させるんだけど、
運用面では、ユーザーIDとパスワードで認証したいケースって多いよね。

なので、手順をまとめてみた。


### 1. `users`テーブルに、以下のカラムを追加

* カラム名: `user_id`
* 型名: `string`

* migrationファイルを作成

```console
$ rails g migration add_user_id_to_users user_id:string
```

* migrationファイルの修正

```rb
class AddUserIdToUsers < ActiveRecord::Migration
	def change
		add_column :users, :user_id, :string, null: false, default: ""
	end
end
```

* migrationファイルを実行

```console
$ rake db:migrate
```

### 2. `users`テーブルに追加した`user_id`に、インデックスを追加

* migrationファイルを作成

```console
$ rails g migration add_user_id_index_to_users
```

* migrationファイルに、`add_index`を追加
	
```rb
class AddUserIdIndexToUsers < ActiveRecord::Migration
	def change
		add_index :users, :user_id, unique: true
	end
end
```
	
* migrationファイルを実行

```console
$ rake db:migrate
```

### 3. `users`テーブルの`email`のインデックスを削除

* migrationファイルを作成

```console
$ rails g migration remove_email_index_from_users
```

* migrationファイルに、`remove_index`を追加

```rb
class RemoveEmailIndexFromUsers < ActiveRecord::Migration
	def change
		remove_index :users, :email
	end
end
```

* migrationファイルを実行

```console
$ rake db:migrate
```

### 4. `app/controllers/application_controller.rb`に、以下の内容を追記

```rb
before_filter :configure_permitted_parameters, if: :devise_controller?

protected

def configure_permitted_parameters
	# strong parametersを設定し、user_idを許可
	devise_parameter_sanitizer.for(:sign_up){|u|
		u.permit(:user_id, :password, :password_confirmation)
	}
	devise_parameter_sanitizer.for(:sign_in){|u|
		u.permit(:user_id, :password, :remember_me)
	}
end
```

### 5. `app/model/user.rb`を、以下のように修正

```rb
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :authentication_keys => [:user_id]
  
  # user_idを必須、一意とする
  validates_uniqueness_of :user_id
  validates_presence_of :user_id

  # user_idを仕様してログインするようオーバーライド
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      # 認証の条件式を変更する
      where(conditions).where(["user_id = :value", {:value => user_id}]).first
    else
      where(conditions).first
    end 
  end 

  # 登録時にemailを不要とする
  def email_required?
    false
  end 

  def email_changed?
    false
  end 
end
```

### 6. `config/locales/devise.views.ja.yml`に、以下の箇所を追加

```yaml
ja:
  activerecord:
    attributes:
      user:
        current_password: "現在のパスワード"
        email: "メールアドレス"
        user_id: "ユーザーID" # ← この1行を追加
        password: "パスワード"
        password_confirmation: "確認用パスワード"
        remember_me: "ログインを記憶"
        ...
```

### 7. `app/views/layouts/application.html.erb`の、以下の箇所を修正

```erb
  <header>
    <nav>
      <% if user_signed_in? %>
		<!-- 修正箇所 START -->
        Logged in as <strong><%= current_user.user_id %></strong>.
        <!-- 修正箇所 END -->
        <%= link_to 'プロフィール変更', edit_user_registration_path %>
        <%= link_to 'ログアウト', sign_out_path %>
      <% else %>
```

### 8. 以下のファイルを、下記のように修正

* `app/views/users/registrations/new.html.erb`
* `app/views/users/registrations/edit.html.erb`
* `app/views/users/sessions/new.html.erb`


```erb
  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true %>
  </div>
```

↓


```erb
  <div class="field">
    <%= f.label :user_id %><br />
    <%= f.text_field :user_id, autofocus: true %>
  </div>
```

以上です。