--- 全体の流れ ---
その1 導入編
その2 ViewとControllerのカスタマイズ編
その3 Deviseの日本語化編
その4 ユーザーIDで、ログイン認証編 ←今ココ
Deviseって、デフォルトは、メルアドとパスワードでログイン認証させるんだけど、
運用面では、ユーザーIDとパスワードで認証したいケースって多いよね。
なので、手順をまとめてみた。
1. users
テーブルに、以下のカラムを追加
-
カラム名:
user_id
-
型名:
string
-
migrationファイルを作成
$ rails g migration add_user_id_to_users user_id:string
- migrationファイルの修正
class AddUserIdToUsers < ActiveRecord::Migration
def change
add_column :users, :user_id, :string, null: false, default: ""
end
end
- migrationファイルを実行
$ rake db:migrate
2. users
テーブルに追加したuser_id
に、インデックスを追加
- migrationファイルを作成
$ rails g migration add_user_id_index_to_users
- migrationファイルに、
add_index
を追加
class AddUserIdIndexToUsers < ActiveRecord::Migration
def change
add_index :users, :user_id, unique: true
end
end
- migrationファイルを実行
$ rake db:migrate
3. users
テーブルのemail
のインデックスを削除
- migrationファイルを作成
$ rails g migration remove_email_index_from_users
- migrationファイルに、
remove_index
を追加
class RemoveEmailIndexFromUsers < ActiveRecord::Migration
def change
remove_index :users, :email
end
end
- migrationファイルを実行
$ rake db:migrate
4. app/controllers/application_controller.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
を、以下のように修正
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
に、以下の箇所を追加
ja:
activerecord:
attributes:
user:
current_password: "現在のパスワード"
email: "メールアドレス"
user_id: "ユーザーID" # ← この1行を追加
password: "パスワード"
password_confirmation: "確認用パスワード"
remember_me: "ログインを記憶"
...
7. app/views/layouts/application.html.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
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
↓
<div class="field">
<%= f.label :user_id %><br />
<%= f.text_field :user_id, autofocus: true %>
</div>
以上です。