Madogiwa Blog

主に技術系の学習メモに使っていきます。

RubyonRails:RubyonRailsチュートリアル回答メモ(第6章)

第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

ここまで