新規登録時にログイン
新規登録したあとに、もう一度ログイン画面でログイン処理するのはユーザーにとって手間ですよね。
新規登録後はそのままログイン処理も済ませるように記述しましょう。
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テーブルに作成し、ユーザー情報をまとめて管理するテーブル設計にしてみました。
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モデルの関連付けを行います。
# 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編集】
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を一緒に作成することができます。
参考資料
関連記事