🌷

Rails チュートリアル 6章

に公開

まえがき

Railsチュートリアル6章において押さえておいた方がいいポイントをまとめ、6章の学習内容を俯瞰し整理することを目的とする。


変更を加えたファイル

作成したファイル

ファイル名 作成手法 説明
<タイムスタンプ>_create_users.rb generate modelで自動作成 マイグレーションファイルであり、下のコマンド"bash(migrate)"を用いる際にはここを参照して変更を行う。モデルは構造自体のルールを定義する一方、こちらでは実際のデータベーススキーマを変更するために定義される。
user.rb generate modelで自動作成 モデルファイルであり、データベースにおける構造上のルールーを定義するファイル。Application Recordを継承することでデータベースの制御を可能にしている。
user_test.rb generate modelで自動作成 モデルによる制約とが実際通したいデータ、通したくないデータを見分けられているかに関してのテストを定義するファイル。
users.yml generate modelで自動作成 テストデータ用のファイルであるが、今回は使用しないので、内容を削除した。
development.sqlite3 初めてdb:migrate実行時に自動作成 このファイルをDB Browser for SQLite(自前にダウンロードの必要あり)で開くことにより、実際に登録されたユーザーデータを閲覧可能。
<タイムスタンプ>add_index_to_users_email.rb generate migrationで自動作成 マイグレーションファイルであり、メールアドレスに対して一意性を確認するためのインデックスの追加を行うために新たに作成したもの。
<タイムスタンプ>

ユーザー登録の第1歩ーDB

データベース構築には基本的にリレーショナルデータベースで扱うSQLのような言語が必要であることが多いが、RailsライブラリであるActive Recordを用いることでデータ構造を定義した、モデルとデータベースを繋げることができ、新たな言語を考慮することなく開発が進められるようになっている。

DBの更新

「マイグレーション」という作業を行うことにより、データベーススキーマに対して変更を加えることができる。逆にこれをしないと、情報が更新されないため注意が必要である。ちなみに、Rails上でのマイグレーションは以下のようにしてターミナルで行う。

bash(migrate)
$ rails db:migrate

試しにデータベースをいじるなら?

以下のようなコマンドでrailsコンソールを開けば安心!閉じたらいじったデータごと消えてくれる!(自動ロールバック)

bash(sandbox)
$ rails console --sandbox

間違って普通のコンソールでデータベースをいじっちゃったら??

以下のようなコマンドを用いればデータベースをリセットできる。

bash(reset)
$ rails db:reset

実際にオブジェクトを作成・保存するときは?

以下のコマンドを実行すれば良い。

rails console
>> user = User.new(name: "Michael Hartl", email: "michael@example.com")
>> user.save

だが、以下のようにcreateを用いれば作成・保存を一括で行うことも可能である。

rails console
>> User.create(name: "A Nother", email: "another@example.org")

削除保存なら、オブジェクトに対してdestroy関数を呼び出せば良い。ちなみに、この新たなオブジェクト作成などにおいて呼び出しているクラスUserはモデルで定義されているクラスであり、テーブルであるusers(構造定義済み)に対して、モデルUserのルールに沿うような形で新たな行を追加しようとする操作がnewやcreateにあたる。

他にもオブジェクトに対するメソッド

  • all
  • find
  • find_by
  • update
  • update_attribute

テスト

今回扱うのは、user_test.rbにおいて定義されている、モデルに記述された制約が期待した通りにデータを許可・拒否できているかを確認するためのテスト群をまとめたクラスのことである。このクラスの先頭にsetupという関数を定義し、インスタンス変数(先頭に「@」がついた変数)を定義すれば、その後登場する全テストにおいて宣言なしでインスタンス変数を用いることができるため、まずは全制約を満たす形のデータをインスタンス変数として与えておくこと。(各テストにおいて確認したい要素についてのみ不正なデータに改変することでモデルの有用性を試す形である。)。モデルについてのテストのみを実行する際には以下のコマンドを与える。

bash
$ rails test:models

また、このテストによく出てくる以下のコードはそれぞれ以下のような意味。

user_test.rb
 assert_not 第1引数    #第1引数の戻り値がfalseであればOK
 assert 第1引数        #第1引数の戻り値がtrueであればOK

制約

モデルにおける制約は以下のようなフォーマットで記述する。

user.rb
validates シンボル, 制約1, 制約2....

制約をつけたいシンボルに対して「,」で区切りながらどんどん制約をつけていくという形である。
主な制約は以下のような感じ。

確認事項 形式 意味
存在性 presence: true 存在するということ
長さ length: { maximum[minimum]: 文字数} 最大[or最小]文字数
フォーマット format: {with: 正規表現} フォーマットが正規表現に沿うということ
一意性 uniqueness: true 一意性があるということ

マイグレーションファイル(一意性に関する)を増やす

マイグレーションファイルもまたgenerateコマンドによって生成することが可能。

bash
$ rails generate migration add_index_to_users_email

今回は、メールアドレスに対して、一意性が必要であるということで、ここに新たにインデックスを追加したい。そのために一意性のマイグレーションを定義する。また、この定義よって、特に記述していない元のマイグレーションが影響を受けることはない。安心!
以下のようにして目的の属性に一意性のためのインデックスを追加する。

add_index_to_users_email
add_index :users, :email, unique:true  #第1引数:テーブル名,第2引数:属性名,第3引数:一意性制約

ハッシュ化

認証を行うとき、パスワードを用いるのが一般的である。本実装においても認証機能をつける。ただ、パスワードをそのまま保存しておくのは危険なので、ハッシュ関数(不可逆的であり、この結果から元のパスワードを復元することは困難)を用いることで変換された後のデータ(password_digest)をデータベースに保存するのが良い。このハッシュ化を行うには、モデルの定義の部分で以下の記述をするだけで良い。

user.rb
has_secure_password

ただ、今のところ作成しているテーブルにはその属性が定義されていないので、新たなマイグレーションファイルにおいて定義する。

add_password_digest_to_users.rb
add_column :users, :password_digest, :string #第1引数: テーブル名,第2引数:作成する属性名, 第3引数:作成する属性の型

実際には、ユーザが入力したパスワードをauthenticateメソッドに与えてハッシュ化を行い、この登録されたpassword_digestと比較を行うことで認証が行われる。


MVCにおけるM(model)に関する現時点での理解

モデルとは、データ構造を定義して、ActiveRecordというライブラリを継承することによってデータベースとのやり取りを行なって、そのデータの情報をコントローラに提供する役割を持つ。データベースの各テーブルと対応するオブジェクトであり、各行をインスタンスとして扱う。ゆえに、ここにインスタンス変数の制約や他のモデルとの関係を記述したりといった作業を行うことになる。

Discussion