Edited at

Rails Tutorialの知識から【ポートフォリオ】を作って勉強する話 #5 Model spec, Herokuエラー編


こんな人におすすめ


  • プログラミング初心者でポートフォリオの作り方が分からない

  • Rails Tutorialをやってみたが理解することが難しい

  • ポートフォリオを作成しながら勉強したい

前回:#4 System spec導入編

次回:#6 サインアップ, エラー日本語化編


こんなことが分かる


  • Model specについて

  • PostgreSQLによるHerokuエラーの回避方法

一緒に勉強しようよう:bow:


Userモデルとテストを実装する

とりあえずTutorial通りにUsersコントローラ、Userモデルを生成。

(同じなのでTutorial 5.4 ユーザー登録:最初のステップから6章までをご覧ください)


bash

$ rails g controller Users new

$ rails g model User name:string email:string

ついでにいくつかの自動生成をfalseにしておく。


config/application.rb

# 中略

class Application < Rails::Application
# 中略
config.generators.test_framework = :rspec
config.generators.system_tests = false
config.generators.stylesheets = false
config.generators.javascripts = false
config.generators.helper = false
config.generators.helper_specs = false
config.generators.view_specs = false

UserモデルのバリデーションはTutorialの通りに。

それからTutorial6章のテストをすべてRSpecで書いてみた。


spec/models/user_spec.rb

require 'rails_helper'

RSpec.describe User, type: :model do

let(:user) { User.new(
name: "Example User",
email: "user@example.com",
password: "foobar",
password_confirmation: "foobar"
) }

describe "User" do
it "should be valid" do
expect(user).to be_valid
end
end

describe "name" do
it "gives presence" do
user.name = " "
expect(user).to be_invalid
end

context "50 characters" do
it "is not too long" do
user.name = "a" * 50
expect(user).to be_valid
end
end

context "51 characters" do
it "is too long" do
user.name = "a" * 51
expect(user).to be_invalid
end
end
end

describe "email" do
it "gives presence" do
user.email = " "
expect(user).to be_invalid
end

context "254 characters" do
it "is not too long" do
user.email = "a" * 243 + "@example.com"
expect(user).to be_valid
end
end

context "255 characters" do
it "is too long" do
user.email = "a" * 244 + "@example.com"
expect(user).to be_invalid
end
end

it "should accept valid addresses" do
user.email = "user@example.com"
expect(user).to be_valid

user.email = "USER@foo.COM"
expect(user).to be_valid

user.email = "A_US-ER@foo.bar.org"
expect(user).to be_valid

user.email = "first.last@foo.jp"
expect(user).to be_valid

user.email = "alice+bob@baz.cn"
expect(user).to be_valid
end

it "should reject invalid addresses" do
user.email = "user@example,com"
expect(user).to be_invalid

user.email = "user_at_foo.org"
expect(user).to be_invalid

user.email = "user.name@example."
expect(user).to be_invalid

user.email = "foo@bar_baz.com"
expect(user).to be_invalid

user.email = "foo@bar+baz.com"
expect(user).to be_invalid

user.email = "foo@bar..com"
expect(user).to be_invalid
end

it "should be unique" do
duplicate_user = user.dup
duplicate_user.email = user.email.upcase
user.save!
expect(duplicate_user).to be_invalid
end

it "should be saved as lower-case" do
user.email = "Foo@ExAMPle.CoM"
user.save!
expect(user.reload.email).to eq 'foo@example.com'
end
end

describe "password and password_confirmation" do
it "should be present (nonblank)" do
user.password = user.password_confirmation = " " * 6
expect(user).to be_invalid
end

context "5 characters" do
it "is too short" do
user.password = user.password_confirmation = "a" * 5
expect(user).to be_invalid
end
end

context "6 characters" do
it "is not too short" do
user.password = user.password_confirmation = "a" * 6
expect(user).to be_valid
end
end
end
end


Tutorialではインスタンス変数を使ってるけど、exampleにはインスタンス変数を使わない方がよいらしいのでletで書き換え。

望ましいテストにするため、しきい値を確認しています。

参考にさせていただきました↓

RSpec入門 - Dotinstall

RSpecで書かれたRailsチュートリアル 第6章のテストコードをレビューしてみた


どうする?PostgreSQLによるHerokuのエラー!?

というわけでプッシュ済ませてheroku run rails db:migrateしようと思ったら...


bash

$ heroku run rails db:migrate

Running rails db:migrate on ⬢ lantern-lantern-app... up, run.2705 (Free)
rails aborted!
PG::ConnectionBad: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

なんだって?...多分PostgreSQLの問題。

調べると色々出てきたけど、なんだかアドオンを足さないと使えないっぽい。

Herokuが出してる公式の拡張アイテムみたいな感じ?


bash

$ heroku addons:add heroku-postgresql

$ heroku run rails db:migrate

できたっぽい!

助けていただきました↓

【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】

【Rails】「heroku run rake db:migrate」を実行しようとすると発生するエラーについて


showビューの仮実装

Tutorialでいうと7章あたり。

RESTfulなUsersリソースをroutesに加えた後、Usersコントローラアクションを実装していく。

Gravatarは使用しないのでTutorial 7.1.4 Gravatar画像とサイドバーはスルー。

showビューは大きく変更。イメージは#1をご覧くだされ。

今回はログイン画面に本腰を入れたいので仮作成に留めました。


app/views/users/show.html.erb

<% provide(:title, @user.name) %>

<div class="container">
<div class="row">
<div class="col bg-primary">
form
</div>
<div class="col bg-secondary">
figure
</div>
</div>
<div class="row">
<div class="col bg-warning">
log
</div>
</div>
</div>

lantern_lantern_show_page_provisional.png

仮すぎて草。

次回はついにサインアップ

いよいよサインアップを実装します:relaxed:

ボリューミーなので覚悟がいりそう、、、


追記

[2019年8月16日]

コントローラテストの自動生成をオンにしました。

(つまりfalseの記述なし → オン)

前回:#4 System spec導入編

次回:#6 サインアップ, エラー日本語化編