【Rails】devise ユーザ名とパスワードでログインする方法
deviseでユーザ名とパスワードでログインでする方法
DMM webcampの課題3では、ユーザ名とパスワードでログインできるようにします。
「rails devise ユーザ名 ログイン」、「rails devise 名前ログイン」で調べて実装します。
自分の理解を深めるために解説をしていきます!
deviseのインストール
-
Gemfile
の1番下にDeviseのGemを追加
gem 'devise'
-
bundle install
コマンドを実行してDeviseのGemをインストール
bundle install
- Deviseの初期設定ファイルを生成するために、
rails generate devise:install
コマンドを実行
rails g devise:install
Modelの作成
Deviseを使用したユーザーモデルを生成するために、rails generate devise MODEL
コマンドを実行。
rails g devise User
モデル名は「User」とします。
このコマンドにより、Deviseが提供する認証関連の機能が含まれたモデルが作られます。
ユーザーテーブルのカスタマイズ
- ユーザーモデルに名前のカラムを追加
rails g migration add_name_to_users name:string:null:false
ユーザーの名前を保存し、ユーザーが名前を使用してログインできるようになるために追加します。
null:false
の記述を入れることで、name
カラムが空のままになることを防ぎます。
- 生成されたマイグレーションファイルをデータベースに適用
rails db:migrate
Viewファイル作成
ターミナルに以下を入力します。
rails g devise:views
app/views以下にdevise
のフォルダが作成されました。
Sign up画面の編集
- フォームを作成するヘルパーとして
form_for
が使用されているので、form_with
へ変更します。 - ユーザー登録の際にnameも登録するため、フォームを追加します。この時、
autofocus: true
を記載します。 -
autofocus
がemailのフォームに入っているため削除します。
<h2>Sign up</h2>
+ <%= form_with model: @user, url: user_registration_path do |f| %>
- <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
+ <div class="field">
+ <%= f.label :name %><br>
+ <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
+ </div>
<div class="field">
<%= f.label :email %><br>
+ <%= f.email_field :email, autocomplete: "email" %>
- <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>
:
:
- アクセスして動作を確認します。
Controllerの編集
初期状態の devise は、サインアップ、サインイン時に「email」と「パスワード」しか受け取ることを許可されていません。
したがって、現状では name を入力しても、データとして保存することができません。
ここで、こちらで指定したデータは保存できるよう、許可を与える必要があります。
これはストロングパラメータと同じ機能です。
以下のように記述します。
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email])
end
end
ひとつずつ解説します。
before_action :configure_permitted_parameters, if: :devise_controller?
deviseの機能(ユーザー登録やログイン認証など)が使われる前に、configure_permitted_parametersメソッドが実行されます
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email])
end
configure_permitted_parametersメソッドでは、devise_parameter_sanitizer.permitメソッドを使うことでsign_upアクション(新規登録)時に、ユーザー名(:name)とメールアドレス(:email)のパラメータを許可しています。
この設定により、新しいユーザーが登録する際に名前を入力できるようになります。
名前が正常に保存され、後続の処理で使用することができます。
- protected vs private
protected:他のコントローラからも参照することができる
private:記述をしたコントローラ内でしか参照できない
ログイン画面の変更
ログイン画面もname
を送るフォームに修正します。
また、Sign up画面同様に、フォームを作成するヘルパーとしてform_for
が使用されているので、form_with
へ変更します。
<h2>Log in</h2>
+ <%= form_with model: @user, url: user_session_path do |f| %>
- <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
+ <div class="field">
+ <%= f.label :name %><br />
+ <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
+ </div>
- <div class="field">
- <%= f.label :email %><br />
- <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
- </div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "current-password" %>
</div>
:
:
email
のフォームを削除し、name
のフォームを追加しました。
devise初期設定ファイルの修正
認証キーの#コメントアウトを外し、email→nameに変更します。
+ config.authentication_keys = [:name]
- # config.authentication_keys = [:email]
バリデーション設定
ユーザ名が空でなく、かつ2文字以上の名前を要求するよう設定します。
validates :name, presence: true, length: { minimum: 2 }
以上で名前とパスワードでログインできるようになりました。
まとめ
ポイントは以下の通りです。
- deviseをインストールしモデルを作成
- nameのカラムを追加しマイグレーション
- コントローラを編集し、nameのパラメータを送れるようにする
- 新規登録画面、ログイン画面の編集
- 認証キーをnameに変更
Discussion
8月にDWCに入学したばかりで課題3に苦戦していたところでとても助かりました!ありがとうございます!
とても嬉しいコメントありがとうございます!
お役に立てたようで嬉しいです♪
一緒に勉強頑張りましょう!!何かあれば気軽に連絡くださいねー^^
昔からプログラミングには興味があったのですがやっと重い腰を上げる事ができました✨…気づいたらもう48になってしまいました(笑)でも頑張って行こうと思います😊 歳のせいか覚えるのが大変ですがなんとか課題も一週間強前倒しでいけてます! がんも先輩!よろしくお願い致します🙇
何歳になってでもチャレンジしている行動力が素晴らしいです!!2か月しか違わないので同期みたいなものですし先輩でもなんでもないです笑
こちらこそkaiserさんの姿勢を見習わせてください!
そして前倒しもすごい!こちらこそよろしくお願いいたします♪
おはようございます😊
2ヶ月も!ですよ!2ヶ月(笑)いろいろご教示お願い致します🤲
今の仕事があまりにも過酷で萎えそうでしたがこれでまたモチベが上がりました!ありがとうございます!(^^)
がんもさん、嬉しいですね(^^)
勝手に私まで連鎖ができてるように感じて、とても嬉しい気持ちになりました笑
いい輪ですね!!(嬉しくてコメントせずには、いられなかった笑)
私も仕事だけにならず個人での学習、アウトプットをさらに頑張ります✨
おはようございます😃
現エンジニア様!!!!フォローさせて頂きましたー\(^o^)/
ありがとうございます🐰✨
4月まで同じDMMでした✌️笑
今日も頑張りましょう〜!
お疲れ様です✨ 返信ありがとうございます!
だ、だ、だ大先輩だ! なんという幸運!
がんも先輩にあいり先輩…なにとぞよろしくお願い致します🤲\(^o^)/
あいりさんに報告したかったのでコメント嬉しいです!😆
あいりさんからの連鎖なので、こうやって繋がっていくのは俺もとても嬉しいです😊
俺も記事を更新していくモチベーションあがりました😍
今日も楽しんで勉強していきましょー!
^^bもし良かったらなんですがoviceで良く勉強してるんで会えたらいいですね!
月が違うとそれは不可能かも...??🤔
私で何か力になれることあれば協力しますので、Kaiser さんもいつでもTwitterとかのメッセージでご連絡ください♪
了解です✨心強いお言葉ありがとうございます!
月生ごとにoviceのチャンネルが違いますからね💡
交流の機会があればいいんですけどねー!
話したいとかでも全然Welcomeですので、また話せたらいいですね😊
お疲れ様です✨
昨日夜中2時まで勉強してしまいました!その時なんですが、oviceで勉強していたのですが1月生の方といろいろお話できたのでもしかしたら月がちがくてもいけるのかなと…(笑)その方は今就職支援サービス中と言っておりました!
1月生なら私と同じ月生ですね、笑
そんなこともあるんですね…!謎ですな笑
あいりさん!Twitterもフォローさせて頂きましたー\(^o^)/
がんもさん!Twitterもフォローさせて頂きましたー\(^o^)/
日曜のお昼12時にスクラムイベントなのでoviceにインできたら来てもらえたらなァって思っていました!チームのメンバーも今よりモチベ上がるかと思ったのです✨(^^)
因みにあいりさん、一昨日勉強教えていだきました方は白田さんという方でしたヨ!
…!存じ上げなかったです笑