コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

社会のボトムズがRailsに手を出す #6

これまでのあらすじ

まだ半分くらいまでしかやっていませんがRailsチュートリアルをやって、病気が治り、宝くじがあたり、結婚することができました。これもひとえにRailsチュートリアルのおかげです。みなさんもRailsチュートリアルをやってスピリチュアルパワーを高めてください。


……、そんなことあるわけないだろっ!!いい加減にしろ。はい、ということで前回はレイアウトを整えました。

前回記事
inujini.hatenablog.com


ユーザモデルをつくろうず

そうしたわけで今回はDBと連携させるためにモデルを作っていきます。とりまモデルをジェネレートします。

# $ rails generate model [モデル名] 
$ rails generate model User name:string email:string

このコマンドでモデルができるそうです。そんでいじるファイルは次の通り。

パス 説明
app/models/***.rb モデル
test/models/***_test.rb テスト

再び登場する雑なメモ。

そうしたら[モデル].create()とかでDBに情報入れこんでいきます。

そういえばSQLiteってこれでGUI操作できるんですね。知らんかった。
DB Browser for SQLite


演習のクラスの確認とかは、以下みたいな確認でいいんかね。

$ rails console --sandbox
>> User.new
>> user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
>> user.save
>> user.name.class

そんでそのあともクエリ操作の演習とかあるけど「以下サイト読んでけばいいんじゃないの?」とか思った(適当)。
Active Record クエリインターフェイス | Rails ガイド
まあいいや。そんな感じでクエリいじって、モデルにちょこちょこ書き加えていけばバリデーションできるとのことです。


あ、この章もいったりきたりの内容なんでmigration使ってDB機能を拡張したりしなかったりしてます。

$ rails generate migration add_index_to_users_email
$ rails generate migration add_password_digest_to_users password_digest:string
$ rails db:migrate

今回はユーザとメールの紐づけ用、パスワード用マイグレーションを作成します。そんで中身にadd_column(テーブル名 カラム名, タイプ [, オプション])とかadd_index(テーブル名, インデックスを付与するカラム名 [, オプション])みたいに追記していきます。

参考
マイグレーション(migration) - - Railsドキュメント

あと、パスワードの方でbcrypt必要になるらしいのでgemファイルに追加してみる。rails serverをつけっぱなしにしてるとbundle install忘れがちな気がする。
bcrypt | RubyGems.org | your community gem host




あとは以下のようにバリデーションを書き書きして、この章は終了です。

# test/models/user_test.rb
require 'test_helper'

class UserTest < ActiveSupport::TestCase
  # 初期値
  def setup
    @user = User.new(name: "Example User", email: "user@example.com", password: "foobar", password_confirmation: "foobar")
  end

  test "あかんな" do
    assert @user.valid?
  end

  test "名前があかんな" do
    @user.name = ""
    assert_not @user.valid?
  end

  test "メールがあかんな" do
    @user.email = "     "
    assert_not @user.valid?
  end

  test "名前が長すぎやで" do
    @user.name = "a" * 51
    assert_not @user.valid?
  end

  test "メールが長すぎやで" do
    @user.email = "a" * 244 + "@example.com"
    assert_not @user.valid?
  end

  test "そのメールアドレスはあかんな" do
    valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org
                         first.last@foo.jp alice+bob@baz.cn]
    valid_addresses.each do |valid_address|
      @user.email = valid_address
      assert @user.valid?, "#{valid_address.inspect} should be valid"
    end
  end

  test "メールが重複しとるで" do
    duplicate_user = @user.dup
    @user.save
    assert_not duplicate_user.valid?
  end

  test "メールは小文字やねん" do
    mixed_case_email = "Foo@ExAMPle.CoM"
    @user.email = mixed_case_email
    @user.save
    assert_equal mixed_case_email.downcase, @user.reload.email
  end
  
  test "パスワードがからやねん" do
    @user.password = @user.password_confirmation = " " * 6
    assert_not @user.valid?
  end

  test "パスワードは短すぎやで" do
    @user.password = @user.password_confirmation = "a" * 5
    assert_not @user.valid?
  end  
end
# test/models/user.rb
class User < ApplicationRecord
    before_save { self.email = email.downcase }
    validates :name, presence: true, length: { maximum: 50 }
    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, presence: true, length: { maximum: 255 },
                      format: { with: VALID_EMAIL_REGEX },
                      uniqueness: { case_sensitive: false }
    has_secure_password
    validates :password, presence: true, length: { minimum: 6 }
end

日本語でテストが書けるということ知ってしまったので、テストを日本語で書いてみる。アサートが割と楽しくなった*1。多分これ、見る媒体によってはエンコードされて暗号みたいな文字列になっていると思うからこの書き方はおすすめできない。個人開発ならありな気もしなくもない。


第六章の感想

ここには書いてないけど、Windowsでやってるせいかようわからんエラーとかに結構遭遇した。Windows環境だと削除されない要素があるから手動で消してくださいみたいなこと書いてあってなんだそれってなった。一回のコマンドで生成されたり削除されたりするものの規模が大きいから本当にそうなのかわからんですけど、一応そんな感じの対応でなんとかなった。やっぱりWindowsはダメだな。

そんな感じで第六章は裏方の処理メインの回でした。この章でログイン画面とか作りはじめるものだと思ってたけどそうでもないらしい。本格的にmigartionとか触った感想としては、何も考えずにマイグレーションファイルぼこぼこつくってDB拡張していくと何やっているかわかんなくなりそうな気がした。


ここまでハイペースで投稿してきたけど次回更新は本当に未定です。

*1:ふざけすぎである