これまでのあらすじ
まだ半分くらいまでしかやっていませんがRailsチュートリアルをやって、病気が治り、宝くじがあたり、結婚することができました。これもひとえにRailsチュートリアルのおかげです。みなさんもRailsチュートリアルをやってスピリチュアルパワーを高めてください。
……、そんなことあるわけないだろっ!!いい加減にしろ。はい、ということで前回はレイアウトを整えました。
ユーザモデルをつくろうず
そうしたわけで今回は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:ふざけすぎである