🐻
【RubyonRails】sorceryを使ってログイン機能を実装する方法
はじめに
RubyonRailsでsorceryを使ってログイン機能を実装するまでのチュートリアルを共有します。
具体的には、以下のような内容で進めます。
- sorceryのインストール
- データベースのマイグレーション
- Userモデルの設定
- ルーディングの設定
- Controllerの作成
- Viewの作成
1. sorceryのインストール
Gemfileにsorceryを追加します。
gem 'sorcery'
bundle installでインストールを実行します。
docker-compose exec web bundle install
以下のコマンドで必要なファイルを生成します。
docker-compose exec web bin/rails g sorcery:install
これにより、以下のファイルが生成されます。
- app/models/user.rb
- config/initializers/sorcery.rb
- マイグレーションファイル
2. データベースのマイグレーション
生成されたマイグレーションファイルをデータベースに反映させます。
docker-compose exec web bin/rails db:migrate
3. Userモデルの設定
Userモデルに認証機能を追加します。
class User < ApplicationRecord
authenticates_with_sorcery!
# ユーザーが設定したパスワードの長さが3文字以上であることを確認
validates :password, length: { minimum: 3 }, if: -> { new_record? || changes[:crypted_password] }
# ユーザーが設定したパスワードと確認用のパスワードが一致していることを確認
validates :password, confirmation: true, if: -> { new_record? || changes[:crypted_password] }
# 確認用パスワードの入力が存在することを確認
validates :password_confirmation, presence: true, if: -> { new_record? || changes[:crypted_password] }
# 新規にユーザーが登録された際に、emailが存在するか、登録済みかどうかを確認
validates :email, uniqueness: true, presence: true
end
4. ルーティングの設定
config/routes.rb
に以下を追加します。
# /loginにアクセスされた場合、user_sessionsコントローラーのnewアクションを呼び出す
get 'login', to: 'user_sessions#new'
# /loginに対してPOSTリクエストが送信された場合、user_sessionsコントローラーのcreateアクションを呼び出す
post 'login', to: 'user_sessions#create'
# /logoutに対してDELETEリクエストが送信された場合、user_sessionsコントローラーのdestroyアクションを呼び出す
delete 'logout', to: 'user_sessions#destroy'
5. Controllerの作成
user_sessions用のコントローラーを作成します。
docker-compose exec web bin/rails g controller user_sessions
app/controllers/user_sessions_controller.rb
を以下のように設定します。
class UserSessionsController < ApplicationController
def new; end
def create
@user = login(params[:email], params[:password])
if @user
redirect_to root_path
else
render :new, status: :unprocessable_entity
end
end
def destroy
logout
redirect_to root_path, status: :see_other
end
end
6. Viewの作成
ログインフォームをapp/views/user_sessions/new.html.erbに作成します。
<%= form_with url: login_path, local: true do |f| %>
<div>
<%= f.label :email %>
<%= f.text_field :email %>
</div>
<div>
<%= f.label :password %>
<%= f.password_field :password %>
</div>
<div>
<%= f.submit "ログイン" %>
</div>
<% end %>
最後に
以上が、RubyonRailsでsorceryを使ってログイン機能を実装するまでのチュートリアルです。
Discussion