第6章の回答メモです。
「ユーザーのモデルを作成する」
問1
問
リスト6.31の、メールアドレスを小文字に変換するコードに対するテストを、リスト6.41に示されているように作成してください。このテストでは、reloadメソッドを使用してデータベースから値を再度読み込み、assert_equalメソッドを使用して同値であるかどうかをテストしてください。リスト6.41のテストが正しいかどうか検証するために、before_saveの行をコメントアウトするとテストが失敗し、元に戻すと成功することを確認してください。
回答
user_test.rb
test "email addresses should be saved as lower-case" do mixed_case_email = "Foo@exAMPle.CoM" @user.email = mixed_case_email @user.save assert_equal mixed_case_email.downcase,@user.reload.email end
user.rb
before_save { self.email = email.downcase } # $ bundle exec rake test の結果: true # before_save { self.email = email.downcase } # $ bundle exec rake test の結果: false
問2
問
before_saveコールバック内でemail.downcase!と書き、email属性を直接変更してもよいことを、テストスイートを走らせて確認してください (リスト6.42のように書いてもよいことを、テストスイートを実行して確認してください。
回答
user.rb
before_save { email.downcase! } # $ bundle exec rake test の結果: true
問3
問
before_saveコールバック内でemail.downcase!と書き、email属性を直接変更してもよいことを、テストスイートを走らせて確認してください (リスト6.42のように書いてもよいことを、テストスイートを実行して確認してください。
回答
user_test.rb
test "email validation should accept invalid addresses" do invalid_addresses = %w[ user@example,com user_at_foo.org user.name@example. foo@bar_baz.com foo@bar..com #"."が2回以上出現するケース ] invalid_addresses.each do |invalid_address| @user.email = invalid_address assert_not @user.valid?,"#{invalid_address.inspect}should be valid" end end
user.rb
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i # $ bundle exec rake test の結果: true # VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i# $ bundle exec rake test の結果: false
ここまで