こんにちは!まろんぼーいです。
今回は、「初心者がWebアプリを作ってみた」シリーズの第5回です。
このシリーズでは、過去に完全初心者の僕が作ったWebアプリを参考に、
初心者なりに試行錯誤しながらその改良版を一から作っていく過程をお見せしています。
このシリーズのモットーは、「同様の初心者が、アプリ作成の流れをつかみながら同様のアプリを作れるようになること」です。
ということで、基本的にアプリを作成していく過程を順を追って解説していますが、
「正確な内容」よりも、「わかりやすいなんとなくのイメージ」を重視して記事を書いています。
経験者の方からすると、「正確にはちがう!」と突っ込みたくなるような内容もあるかと思いますが、
難しい知識よりも、なんとなくでいいので流れをつかむ!
そんな内容となっていますので、同じ初心者の方の参考になればうれしいです!
それでは今回もはじめていきましょう!
〇マイグレーションファイル作成
では、トップページが作れたので、いよいよModelを扱う機能の実装をしていきます。
まずは、User機能です。
M(Model)のC(Controller)、R(Router)、V(View)の実装については次回の記事意向で説明していきますが、
この記事ではトップページで作らなかったModel作成の導入部分だけ行いたいと思います。
Modelは、特定の種類のデータを保管する表です。
今回はUserの情報を補完するModelを作るわけですが、
まずは、Userの情報としてどんな項目を設けるか決める必要があります。
イメージとしては、ユーザを新規登録するときに
登録する項目です。
今回は最低限として、「名前(name)」、「メールアドレス(email)」、「パスワード(password_digest)」を項目として設定します。
作り方は簡単です。
ターミナル(自分のアプリのフォルダ内にいることを常に確認)で、以下を入力します。
1 |
$ rails generate model User name:string email:string password_digest:string |
はい、例によって英語で考えると、
「railsで、name(文字列)、email(文字列)、password_digest(文字列)の項目を持った、
Userという名前のModelを作成(generate)する」
です。
「name:string」のように記述しているのは、
「『name』の項目は文字列(string)な!数字や日付とかじゃないよ!」
とnameに何が入るか定義してあげる必要があるためです。
また、「〇〇_digest」は、○○を暗号化するコードとなっています。
セキュリティ的に、流出してはダメなものはあります。
passwordはまさにその代表的なもので基本暗号化が必要なので、
パスワードは「password_digest」で覚えておいていいかと思います。
先ほどのターミナル操作で、Userモデルのマイグレーションファイルができます。
〇マイグレーションファイルとは
先ほど、ターミナルで以下を実行し、Userモデルのマイグレーションファイルを作成しました。
1 |
$ rails generate model User name:string email:string password_digest:string |
マイグレーションファイルとは、「Modelを作成するためのデータベースの設計図」という認識でいいと思います。
①上記コマンドでマイグレーションファイル(設計図)を作成
↓
②マイグレーションファイルを実行(設計図を形に)
↓
③Modelの完成
といった流れです。
〇【User機能】Modelの作成
ではUserのModelについては①までできたので、②から進めていきます。
ちなみに、マイグレーションファイルは以下のフォルダにあります。

この「2020~users.rb」というファイルです(作成した日時が入っている)。
さて、マイグレーションファイルの実行ですが、以下をターミナルで実行することでできます。
1 |
$ rails db:migrate |
「railsで、db(データベース)のマイグレーション(migrate)を行う」ですね。
これで、以下のフォルダにuser.rbが作られていればおけです。

さて、user.rbを開くと以下のようになっております。
1 2 |
class User < ApplicationRecord end |
まずやることは、項目として定義したname、email、password_digestの設定です。
とりあえず、僕が作ったuser.rbはコチラです。
1 2 3 4 5 6 7 8 9 10 11 |
class User < ApplicationRecord before_save { self.email.downcase! } validates :name, presence: true, length: { maximum: 10 }, uniqueness: true validates :email, presence: true, length: { maximum: 255 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }, uniqueness: { case_sensitive: false } validates :password, allow_blank: true, length: { minimum: 6 } has_secure_password end |
各行の意味を確認します。
1 |
before_save { self.email.downcase! } |
「セーブする前に、emailの項目を小文字化する」
メールアドレスは基本全て小文字なので、downcaseで小文字化します。
self.emailについては、ググると解説が出てきますので調べてみましょう。
この記事ではところどころで「ググれググれ」言っていますが、
基本プログラミングはググりながら進めていきます。
調べる力もつけながら一緒に頑張りましょう。
1 2 |
validates :name, presence: true, length: { maximum: 10 }, uniqueness: true |
「nameについての制約(Validates)を設ける ・存在が不可欠(空欄はダメ) ・長さは最大10文字 ・オンリーワンであることが不可欠(ほかのユーザーと同じものは使えない)」
1 2 3 |
validates :email, presence: true, length: { maximum: 255 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }, uniqueness: { case_sensitive: false } |
「・emailについての制約(Validates)を設ける
・存在が不可欠(空欄はダメ)
・長さは最大255文字
・正規表現
・オンリーワンであることが不可欠(ほかのユーザーと同じものは使えない)」
正規表現については、とりあえずすっ飛ばします!!(笑)
他は比較的わかりやすいです。よくサイトでユーザ登録するときにエラーが出たりしますが、
それはこのようにサイト制作者側がルールを設けているためです。
1 |
validates :password, allow_blank: true, length: { minimum: 6 } |
「・password_digestについての制約(Validates)を設ける
・空白もオッケー
・長さは最小6文字」
さて、最後です。
1 |
has_secure_password |
has_secure_passwordは、パスワード機能についての便利なメソッドです。
簡単に言うと、これを書いておけば、新規登録やログイン時に、
「パスワード」欄と「パスワード確認」欄の一致を確かめてくれます。
僕はコチラのQiitaの記事で学ばせていただきました!
ちなみにこちらの記事にもある通り、has_secure_passwordを使うためには「bcript」というGemを入れる必要があります。
Gemについては以前も書きましたが、いろんな機能を簡単に実装するためのパッケージです。
Gemfileに入れたいgemを追記し、ターミナルでbundle installすることで使えます。
では実際にbcriptを入れていきます。
アプリの直下に「Gemfile」という名前のファイルがあります。
ファイルを開いて、以下の文を探します。
1 |
# gem 'bcrypt', '~> 3.1.7' |
(3.1.7はバージョンなので違うかも)
これは、Railsは非常に有能なので、良く使われているgemはすでに準備してくれているんです。
bcriptも同様で、コードはすでに書いてあって、あとはコメントアウトを外せばオッケーという状態にしてくれています。
では、先頭についている#を取って、コードを有効にしましょう。
1 |
gem 'bcrypt', '~> 3.1.7' |
それではこちらのコードを有効にしましょう。
ターミナルで以下を実行します。
1 |
$ bundle install |
ちなみにbundle install後はサーバーの再起動が必要なので、
「rails s」で起動していたサーバーをCTRL + Cで止め、再び「rails s」で起動しましょう。
ちなみに、上記のMigrationができていないと、
「Migrations are pending!」みたいなエラーが出るので、出たら「rails db:migrate」のし忘れを確認しましょう。
さて、これでuser.rbの設定が完了しました。
〇次回 ~【User機能】index、showの作成~
UserのModelができたので、次回はController、Router、Viewの作成に入っていきます。
Userではindex、show、new、create、edit、update、destroyの七つのメソッドを実装しますが、
次回はそのうち、ユーザ一覧ページであるindexと、特定のユーザページを担うshowを作成します。
お楽しみに!