3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

deviseのユーザー機能をメールアドレスなしで登録するようにカスタマイズ

Posted at

名前とパスワードだけで新規登録もログインもできるようdeviseをカスタマイズして利用したときの備忘録。

Railsは6.0.2
同じ実装をされている方もいたけどバージョンによって実装が変わるみたいでコピペしてやってもうまくいかなかった...

  # <div class="field">
  #   <%= f.label :email %><br />
  #   <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  # </div>
  # ↑を↓に修正

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>
config/initializers/devise.rb
# config.authentication_keys = [:email]
# config.case_insensitive_keys = [:email]
# config.strip_whitespace_keys = [:email]
# ↑を↓に(下から数えて二つは変えなくてもいいかも。一応一緒に変えとく。)
config.authentication_keys = [:name]
config.case_insensitive_keys = [:name]
config.strip_whitespace_keys = [:name]
models/user.rb

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :authentication_keys => [:name] # 認証のキーをメールから名前へ

  validates_uniqueness_of :name
  validates_presence_of :name

  # nameを利用してログイン
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions).where(["name = :value", { :value => name }]).first
    else
      where(conditions).first
    end
  end

  def email_required?
    false
  end

  def email_changed?
    false
  end
end
application_controller
 # 以下追記
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name] )
  end

完成。

①上記変更したのにまだundefined method `email'のエラーが出る場合

undefined method `email'   
match ? attribute_missing(match, *args, &block) : super

ってエラーに悩まされてる場合、
自分が触っているviewが反映されていない可能性が。
deviseのビューを作成するときに

rails g devise:views users

で作っていたら、deviseはデフォルトだとapp/views/deviseのviewを探しにいってしまうので、

config/initializers/devise.rb
config.scoped_views = true

とする必要あり。
(そもそもadminとか他のユーザー機能つけないならrails g devise:viewsで作ったほうがいいかも。
削除して作り直したい場合は→rails destroy devise:views users)

②新規登録しようとするとUndefined method will_save_change_to_email?エラー

以下の記載を付け足す。

models/user.rb
 def will_save_change_to_email?
   false
 end

参考記事
https://qiita.com/jagrament/items/f172b88861ac477621d1
https://github.com/heartcombo/devise#starting-with-rails

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?