演習2
テストスイートの実行結果を確認しながら、before_saveコールバックをemail.downcase!に書き換えてみましょう。ヒント: メソッドの末尾に!を付け足すことにより、email属性を直接変更できるようになります (リスト 6.34)。
class User < ApplicationRecord before_save { 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 } end
コールバックメソッドを用いて、データベースに保存する前にdowncase!
で!
を使用する演習です。
演習を行った後に、そのまま6.3/6.3.2に行くと新たな設定を加えた後にリスト6.40にてテスト結果がGreenになることを想定しているのですが、当然ながら、結果はRedとなり帰ってきます。
対処
terminalにて返ってくるエラーより、問題となる箇所はemail address should be unique
になります。
そこで/test/models/user_test.rb
に移動して
test "email addresses should be unique" do
duplicate_user = @user.dup
duplicate_user.email = @user.email.upcase! #ココ! "!"を加える
@user.save
assert_not duplicate_user.valid?
end
/models/user.rb
にてコールバックメソッドにて!
を用いた書き換えを行っているので、それに対応するようにテストコードにも!
を記述しなければいけないのですが、演習では「書き換えてみましょう!」で確認することまでは記述されていないので忘れてしまってはいけないわけですね。
さして引っかかることもないかと思いますがテストを書き慣れていないので、備忘録になります・・。