はじめに
rails tutorialで使われているE-mailとパスワードを使ったログインより、もっとシンプルに実装する。
deviseなどのgemは使わない。
前提
- rails tutorialなど基本的なrailsの知識
- Mac
- Ruby on Rails6
- テストは省略
目標
ここではRoomテーブルの名前とパスワードを使ってログインする。
手順
まずログインするモデルを作成する。今回はRoomテーブル
MacBook % rails g model Room name:string
生成されたマイグレーションファイルに追記し、マイグレーションをかける
これによって、空の名前はデータベースに保存できなくなる
/db/migrate/タイムスタンプ.create_rooms.rb
class CreateRooms < ActiveRecord::Migration[6.0]
def change
create_table :rooms do |t|
t.string :name, null: false
t.timestamps
end
end
end
MacBook % rails db:migrate
Room.rbにhas_secure_passwordのメソッドを追加する
/app/models/room.rb
class Room < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
has_secure_password
end
password_digestカラムを追加するマイグレーションを作成し、マイグレーションをかける
MacBook % rails generate migration add_password_digest_to_rooms password_digest:string
MacBook % rails db:migrate
- Gemfileを開き、gem 'bcrypt'のコメントアウトを解除しinstallする
/Gemfile
~
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
gem 'bcrypt', '~> 3.1.7'
# Use Active Storage variant
# gem 'image_processing', '~> 1.2'
~
- 空のpasswordと最低文字数を追加で制限する
/app/models/room.rb
class Room < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
has_secure_password
validates :password, presence: true, length: { minimum: 6 }
end
- Rails console でインスタンスが生成、データベースに保存できるか確認する
- サーバーを立ち上げているのとは別のターミナルから
MacBook % rails c
~
irb(main):001:0> @room = Room.new(name:"tokyoroom",password:"password",password_confirmation:"password")
(2.2ms) SET NAMES utf8mb4, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> #<Room id: nil, name: "tokyoroom", created_at: nil, updated_at: nil, password_digest: [FILTERED]>
irb(main):002:0> @room.save
(0.7ms) BEGIN
Room Create (3.3ms) INSERT INTO `rooms` (`name`, `created_at`, `updated_at`, `password_digest`) VALUES ('tokyoroom', '2020-09-23 07:26:30.787094', '2020-09-23 07:26:30.787094', '$2a$12$SmCtpmRZn0M5BMtuT6BmAOKO.DMAmMOIYSXoHlxDrSbA2AQcAYnMC')
(5.0ms) COMMIT
=> true
続き[2]
Railsでログイン機能をシンプルに名前とパスワードだけで実装したメモ(2)
参考文献