13
8

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 1 year has passed since last update.

記事投稿キャンペーン 「Rails強化月間」

Gem sorceryを使い倒す② ログイン機能応用編

Last updated at Posted at 2023-11-05

新規登録時にログイン

 

新規登録したあとに、もう一度ログイン画面でログイン処理するのはユーザーにとって手間ですよね。
新規登録後はそのままログイン処理も済ませるように記述しましょう。

controller/users_controller.rb
def create
    @user = User.new(user_params)
    if @user.save
      login(user_params[:email], user_params[:password])
      redirect_to curriculum_logs_path
      flash[:success]= 'サインアップしました'
    else
      flash.now[:danger] = 'サインアップに失敗しました'
      render :new, status: :unprocessable_entity
    end
  end

if @user.saveできたら、その後にloginメソッドを記述します。
これで新規登録後、自動的にログインすることができます。
 

少し複雑なテーブル設計でのログイン

 

基本のログインでは、sorceryの機能を使い作成したusersテーブルにnameカラムを追加する方法を採用しましたが、今回はnameカラムをprofileテーブルに作成し、ユーザー情報をまとめて管理するテーブル設計にしてみました。

db/schema.rb
  create_table "profiles", force: :cascade do |t|
    t.string "name", null: false
    t.string "language"
    t.string "introduction"
    t.string "avatar"
    t.bigint "user_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_profiles_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", null: false
    t.string "crypted_password"
    t.string "salt"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
  end

  add_foreign_key "profiles", "users"
end

今回のテーブル設計では、ユーザー登録の際にusersに関連づいたprofileテーブルも一緒に作成する必要があります。nameがnull: falseになっているので、登録画面にnameを入力するfomeを追加する必要があります。
 

 
【モデルの関連付けをする】

まず、ユーザーがプロフィール情報も同時に登録できるようにするためには、UserモデルとProfileモデルの関連付けを行います。

models/
# user.rb
class User < ApplicationRecord
 has_one :profile
 accepts_nested_attributes_for :profile
end

# profile.rb
class Profile < ApplicationRecord
 belongs_to :user
end

 
 
【入力フォームを作成】

<%= form_with model: @user do |f| %>
    <%= f.label :email %>
    <%= f.email_field :email %>

    <%= f.label :password %>
    <%= f.password_field :password %>

    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation %>
  
  <%= f.fields_for :profile do |profile_form| %>
      <%= profile_form.label :name %>
      <%= profile_form.text_field :name %>
  <% end %>

    <%= f.submit "登録", class: "btn btn-secondary" %>
<% end %>

入力フォームはemail、password、password_confirmationに、profileのパラーメーターを扱うフィールドを追加します。

【controller編集】

users_controller.rb

class UsersController < ApplicationController
  skip_before_action :require_login, only: %i[new create]

  def new
    @user = User.new
    @user.build_profile
  end

  private

  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation, profile_attributes: [:name])
  end
end

newアクションに@user.build_profileを追加することで、新しいユーザーオブジェクトに紐付く新しいプロフィールオブジェクトを作成します。
Strong Parameters に、プロフィールの属性を追加します。

 
これで新規作成時にProfileを一緒に作成することができます。

参考資料

関連記事

13
8
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
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?