大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

初めてのポートフォリオ作成 #3

今回は「初めてのポートフォリオ作成」の#3です。

 

過去の日記はこちら

初めてのポートフォリオ作成 #0 - 大田区から発信するゆるゆる日記

初めてのポートフォリオ作成 #1 - 大田区から発信するゆるゆる日記

初めてのポートフォリオ作成 #2 - 大田区から発信するゆるゆる日記

初めてのポートフォリオ作成 #2.5 - 大田区から発信するゆるゆる日記

 

deviseを使ったユーザー登録機能(ネスト項目含む)を実装したので、その内容を書きます。

全部書くと長くなるので、2回に分けて書いていきます。

 

※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂ける場合は自己責任でお願いします。 

【目次】

環境

rails 5.2.3

ruby 2.6.3

devise 4.6.2

 

やりたいこと

devise gemを用いてユーザー・ログイン機能を実装する。また、ネストしている別テーブルの性別テーブルからデータ出力と保存を行う。

 

ユーザー・ログイン機能の実装

性別テーブル作成

◆国際規格に基づき、性別テーブルを作成する

ターミナル

$ rails g model gender gender:string

 マイグレーションファイル

class CreateGenders < ActiveRecord::Migration
def change
create_table :genders do |t|
t.string :gender
end
end
end

※カラム削除する場合

(例)rails generate migration Removeカラム名Fromテーブル名 カラム名:データ型名

rails generate migration RemoveCreated_atFromGenders created_at:datetime updated_at:datetime

 ターミナル

$ rails db:migrate

 

◆データを挿入

挿入するデータ内容

+----+-----------+
| id | gender |
+----+-----------+
| 0 | 未回答 |
| 1 | 男性 |
| 2 | 女性 |
| 9 | その他 |
+----+-----------+

 

指定した数字から連番始まりを開始できるようにする。

mysql

> alter table genders auto_increment = 0;

 

 idで0を使えるようにする。

mysql

> set global sql_mode='NO_AUTO_VALUE_ON_ZERO';

 

 

データを挿入する。

mysql

> insert into genders (id, gender) values (0, '未回答'),(1, '男性'),(2, '女性'),(9, 'その他');

 

※補足

mysqlのデータ変更

> update テーブル名 set カラム名 = 設定する値 where 検索条件;

 

ユーザー・ログイン機能を実装

◆devise gemをインストールする 

gemfile

gem 'devise'

 

外部キーのgenderカラムを含む、その他必要なカラムをファイルに追記する。

マイグレーションファイル

add_reference :users, :gender, foreign_key: true
add_column :users, :username, :string, null: true
add_column :users, :message, :string

 ターミナル

$ rails db:migrate #マイグレーションを実行する
$ rails g devise:install #deviseをインストールする

 

◆deviseをインストールした時に、ターミナルに表示される指示に従ってファイルを編集する

config/environments/development.rb(追加)

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

config/routes.rb

root 'home#index'

app/views/layouts/application.html.erb

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

 

◆deviseでモデル・ルーティングを作成

ターミナル

$ rails g devise user

 

◆deviseでコントローラーを作成

ターミナル

$ rails g devise:controllers user

 

ついでにusersコントローラーのshowも作成

ターミナル

$ rails g controller Users show

 

◆モデルの定義を行う

models/user.rb

has_one :gender

models/gender.rb

belongs_to :user

 

◆deviseでビューファイルを作成

ターミナル

$ rails g devise:views users

 

次回

次回は具体的な設定内容を書いていきます!

地道にポートフォリオ作っていきます!

 

参考サイト

GitHub - plataformatec/devise: Flexible authentication solution for Rails with Warden.

 

※見なくても良い補足情報

MySQL 8.0.4の認証方式変更

MySQL 8.0.4のデフォルトの認証方式が変更になっています。

デフォルトの認証方式ではrails開発では都合が悪いそうなので、認証方式の変更方法を書いておきます。

下記の記載内容はセキュリティ面などを全く調べていないので、実行される場合は自己責任でお願いいたします。

 

mysqlログイン後

認証方式を確認

> SELECT user, host, plugin FROM mysql.user;

pluginが「caching_sha2_password」になっていると思いますが、これが都合悪いようです。

 

認証方式を変更

> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

これを実行すると、rootのpluginが「mysql_native_password」に変更されていると思います。

他のuserでログインする場合は、上記の「root」と「localhost」を変更する必要があります。

 

mysqlをリスタート 

$ mysql.server restart

 

上記の方法以外では、新規ユーザ作成時の認証方式を変更する方法もあります。

mysqlログイン後

> default-authentication-plugin = mysql_native_password

 

こちらを最初に登録しておくと、次回から新規ユーザを作成する際には、pluginが「mysql_native_password」でユーザが作成されます。

 

②カラムの制約変更のrailsコマンド 

$ rails g migration ChangeColumnToUser