LoginSignup
1
1

More than 3 years have passed since last update.

Railsチュートリアル(第4版)メモ 第6章

Posted at

Railsチュートリアル(第4版)の個人メモ
気になった部分、忘れそうな部分を記述。

  • Ruby 2.6.1
  • Rails 5.1.6

前章の最後 (5.4) でUsersコントローラを作成した。そのつづき。
6〜12章にかけて、ユーザ認証の各機能について作成していく。
6章ではこのうち、ユーザのデータモデル、保存について扱われている。

※ おわび
ナレッジになりきれていないメモをQiitaに上げるのが違うような気がしてきたが、
記事として所感を上げれば、それなりに反応があり、勉強にもなったため、お目汚しにはなりますが何卒ご容赦を。
そして最近Rails書いてないのだが下書が埋まってきたので放流。

6章 ユーザーのモデルを作成する

Railsでは認証を実装するための仕組みが既に整っているが、サービスごとに認証には多くのカスタムが必要になる。
このため、車輪の再発明にはなるが、方法を知っていればサードパーティ製の認証も実装しやすくなるので、Railsチュートリアルでは車輪を再発明している。

6.1 Userモデル

Railsは、データモデルとして扱うデフォルトのデータ構造を Model (MVCのM) と呼ぶ。
このModelとのやり取りにはRailsデフォルトでは Active Record というものが使われる。
これはSQLを意識せずにCRUDや構築を行ってくれるもの。

6.1.1 データベースの移行

データベースを永続化するためにUserモデルを作成。
Usersコントローラ作成時と同様、 $ rails g する。

注意として、
コントローラは 複数形 Users
モデルは 単数形 User

とするのが慣習。

$ rails g model User name:string email:string

DBで使う属性(DBでいうカラム名)と、型を : を挟んで渡す。

諸々生成されるが、 db/migrate/ には タイムスタンプ_create_モデル名s.rbというファイルができる。
ここでDB作成のための情報が定義される。

db/migrate/タイムスタンプ_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

idとタイムスタンプについては、特に指定なしでも自動で用意される。
クラス名の部分を見ると、 ActiveRecord::Migration[5.0] を継承しているらしい。
(Railsチュートでは5.0だが、小生の環境は5.1の表記)
timestamps は、タイムスタンプに係る2つのカラム [ created_at, updated_at ] を作成してくれる。

mysqlだとこんなかんじだろうか。

mysql
CREATE DATABASE User;
USE Users;
CREATE TABLE users(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(300),
  email VARCHAR(300),
  created_at TIMESTAMP NOT NULL CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
);

sql書くたびに大文字or小文字 許さないおじさんが発生しそうだな、とビクビクしながら書いている(前職にもいた)。
正直、今の御時世、すべて小文字でも問題ないんだとおもっている。
ちなみに前職では日付はvarchar()で書いてうわなにをするやめろ

マイグレーションを適用。
友人曰く、複数人開発で特に気を遣わんと爆死するコマンドだから、と念を押された。気をつけよう。
DB側はバージョン管理されてるわけではない。

$ rails db:migrate

6.1.2 modelファイル

演習
Railsコンソールで User.new をし、どのような継承関係に有るのか確認した。

Userクラス < ApplicationRecord < ActiveRecord::Base < Object < BaseObject

6.1.3 ユーザーオブジェクトを作成する

railsコンソールのサンドボックスオプション

を使うと、DBへの変更を終了時にすべてロールバックしてくれる。

$ rails console --sandbox

この中での実験。
モデルを生成した際にuserクラスが生成され( app/model/ )、これが ActiveRecord から継承されている。

以下使ったメソッド
valid? : 有効性(Validity)の確認
save : 保存
保存した際、 create_at , update_at にタイムスタンプが押される。
戻り値に、保存ができたかどうかのbool値が帰ってくる。

create : User.new ではメモリ内に生成するだけだったが、生成と同時に保存する。

演習
User.create
user.name
ActiceSupport::timeWithZone

6.2 ユーザーを検証する

6.2.1 有効性を検証する

要はSQLでのカラム型指定みたいな話
:email に対して、 Double とか Boolean は入らんとか。
以下4点

  • 存在性 (presence)
  • 長さ (length)
  • フォーマット (format)
  • 一意性 (uniqueness)

所感

  • usersテーブルに削除フラグって要るような気がする。後で追加するのか?
  • dbのmigrateファイル、いっつも書くidとかをよしなにやってくれるのもだし、varcharとかで文字数指定しなくて良いのだけでも楽。
  • dbのmigrateファイル、変更が時系列で残ってくれるのがとても安心感ある。前職ではDBに変更掛けたときのSQLすら遺してなかった。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1