読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【52日目】【1日20分のRailsチュートリアル】【第6章】演習の2.と3.

Ruby on Railsチュートリアル(第3版)

今日は「6.5 演習」の2.から。

6.5 演習

  1. before_saveコールバック内でemail.downcase!と書き、email属性を直接変更してもよいことを、テストスイートを走らせて確認してください (リスト6.42のように書いてもよいことを、テストスイートを実行して確認してください。

before_saveでemail属性を直接小文字に変換するようにコード変更。

app/models/user.rb

  before_save { email.downcase! }

テストは特に問題なし。

$ bundle exec rake test
19 tests, 38 assertions, 0 failures, 0 errors, 0 skips

下記ページ読んだ感じはdowncaseメソッドはdowncase!として使うこともよくあるのかな…?という印象。
まぁ小文字にするだけだしそんな影響ないよね。たぶん。

downcase, downcase! (String)

  1. 6.2.4で説明したように、 リスト6.21のメールアドレスチェックする正規表現は、“foo@bar..com”のようにドットが連続した無効なメールアドレスを許容してしまいます。
    このメールアドレスをリスト6.19の無効なメールアドレスリストに追加し、これによってテストが失敗することを確認してください。
    次に、リスト6.43に示したもう少し複雑な正規表現を使用して、このテストがパスするようにしてください。

まずfoo@bar..comをテストでチェックするメールアドレスに追加する。
下記のinvalid_addressesに追加。

test/models/user_test.rb

  test "email validation should reject invalid addresses" do
    invalid_addresses = %w[user@example,com user_at_foo.org user.name@example.
                           foo@bar_baz.com foo@bar+baz.com foo@bar..com]
    invalid_addresses.each do |invalid_address|
      @user.email = invalid_address
      assert_not @user.valid?, "#{invalid_address.inspect} should be invalid"
    end
  end

テスト実行すると失敗します。

$ bundle exec rake test
 FAIL["test_email_validation_should_reject_invalid_addresses", UserTest, 2016-08-09 12:46:01 +0000]
 test_email_validation_should_reject_invalid_addresses#UserTest (1470746761.54s)
        "foo@bar..com" should be invalid

リスト6.43の通り、app/models/user.rb正規表現

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

から

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

に変更。

(\.[a-z\d\-]+)*が増えてます。
中身の理解は諦めました。。。正規表現はまたいつか。

テスト実行して今度は問題ないことを確認。

$ bundle exec rake test
19 tests, 39 assertions, 0 failures, 0 errors, 0 skips

これで第6章の演習は終了です。Railsチュートリアルは全部で12章なのでやっと半分!

今日の作業時間は【26分】

次は「第7章 ユーザー登録」から。