テーブルにusernameカラムを追加する
usernameカラムを追加
ターミナル
$ rails generate migration add_username_to_users username:string:uniq
$ rake db:migrate
フォームから送られたパラメーター許可の設定
app/controllers/application_controller.rb
# deviseコントローラーにconfigure_permitted_parametersメソッドを追加
before_filter :configure_permitted_parameters, if: :devise_controller?
...
private
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
end
ログイン用のパラメータlogin(=emailまたはusername)をモデルに設定する
loginパラメータのアクセサを設定
app/models/user.rb
attr_accessor :login
ログイン認証用キーをloginに設定
app/models/user.rb
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:validatable, :authentication_keys => [:login]
ログイン認証条件を書き換え(find_first_by_auth_conditionsをオーバーライド)
app/models/user.rb
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first
else
where(conditions).first
end
end
usernameのバリデーションを設定
app/models/user.rb
validates :username,
:uniqueness => {
:case_sensitive => false
},
:format => { ... } # etc.
Viewの書き換え
Viewファイル一覧を生成(オーバーライドするため)
ターミナル
$ rails g devise:views
Viewファイルの書き換え
app/views/devise/sessions/new.html.erb
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>
↓↓↓書き換え
<p><%= f.label :login %><br />
<%= f.text_field :login %></p>
app/views/devise/registrations/new.html.erb
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>
app/views/devise/registrations/edit.html.erb
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>