心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。6.5章。

   


演習1問目。

リスト6.20の、メールアドレスを小文字に変換するコードに対するテストを、リスト6.30に示されているように作成してください。このテストでは、reloadメソッドを使用してデータベースから値を再度読み込み、eqメソッドを使用して同値であるかどうかをテストしてください。before_saveの行をコメントアウトすることで、リスト6.30が正しい対象をテストしていることを確認してください。

リスト6.20では、user.rbで、emailをDB保存前にCallbacksのbefore_saveで小文字変換していたのでした。
before_save { self.email = email.downcase }

これのテストを書けというのですが、リスト6.30がそのまま答えでいいと思います。

リスト6.30 リスト6.20のメールアドレス小文字変換をテストする。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
  .
  .
  .
  describe "email address with mixed case" do
    let(:mixed_case_email) { "Foo@ExAMPle.CoM" }

    it "should be saved as all lower-case" do
      @user.email = mixed_case_email
      @user.save
      expect(@user.reload.email).to eq mixed_case_email.downcase
    end
  end
  .
  .
  .
end

演習2問目。

before_saveコールバックをリスト6.31のように書いてもよいことを、テストスイートを実行して確認してください。

リスト6.31 before_saveコールバックの別の実装。
app/models/user.rb

class User < ActiveRecord::Base
  has_secure_password
  before_save { email.downcase! }
  .
  .
  .
end

現在のuser.rbは以下の通りです。

class User < ActiveRecord::Base
  before_save { self.email = 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, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, length: { minimum: 6 }
end

確かにテストはパスしました。
もう少しcallback関数やhas_secure_passwordあたりをお勉強します。

演習3問目。

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

テストにfoo@bar..comを追加しました。テストは失敗します。

略
  describe "emailフォーマットのテスト" do
    it "emailフォーマットが不正な場合" do
      addresses = %w[user@foo,com user_at_foo.org example.user@foo.
                     foo@bar_baz.com foo@bar+baz.com foo@bar..com]
      addresses.each do |invalid_address|
        @user.email = invalid_address
        expect(@user).not_to be_valid
      end
    end
略

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

foo@bar..comが拾えていないからですね。
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+\.[a-z]+\z/i
とすればこのテストは通りそうですが、今度は正しいほうのフォーマットがダメになった。
考えていたら答えが書いてありました。

リスト6.32 有効なメールアドレスかどうか(ドットが2つ以上連続するかどうか)を検証する正規表現
app/models/user.rb

class User < ActiveRecord::Base
  .
  .
  .
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  .
  .
  .
end

ちょっと、正規表現はうまいぐあいにまとまっているサイトがないので、別途まとめようと思う。

4問目。

Rails APIサイトのActiveRecord::Baseの項を読み通し、どんなことができるかを把握してください。

できること。

Active Record – Object-relational mapping put on rails
gitはここ。ひたすらrequireしてincludeしてるだけだ。

Included Modules

ActiveRecord::Persistence
ActiveRecord::ReadonlyAttributes
ActiveRecord::ModelSchema
ActiveRecord::Inheritance
ActiveRecord::Scoping
ActiveRecord::Sanitization
ActiveRecord::AttributeAssignment
ActiveModel::Conversion
ActiveRecord::Integration
ActiveRecord::Validations
ActiveRecord::CounterCache
ActiveRecord::Locking::Optimistic
ActiveRecord::Locking::Pessimistic
ActiveRecord::AttributeMethods
ActiveRecord::Callbacks
ActiveRecord::Timestamp
ActiveRecord::Associations
ActiveModel::SecurePassword
ActiveRecord::AutosaveAssociation
ActiveRecord::NestedAttributes
ActiveRecord::Aggregations
ActiveRecord::Transactions
ActiveRecord::Reflection
ActiveRecord::AttributeMethods::Serialization
ActiveRecord::Store
ActiveRecord::Core

5問目。

Rails APIサイトでvalidatesメソッドを調べ、どんなことができるか、どんなオプションがあるかを調べてください。

これはやってる途中に調べました。
validates :terms, acceptance: true
validates :password, confirmation: true
validates :username, exclusion: { in: %w(admin superuser) }
validates :email, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, on: :create }
validates :age, inclusion: { in: 0..9 }
validates :first_name, length: { maximum: 30 }
validates :age, numericality: true
validates :username, presence: true
validates :username, uniqueness: true

6問目。

Rubularで2〜3時間ほど遊んでみてください。

10分くらいやりましたがいまいち面白くありません。。
サンプル入れると、この正規表現がおすすめ!みたいなのがでてくるといいな。難しいか。

ちょっと駆け足気味ですが、
本当は静的ページから作り出さずに、userモデルから作り出せばよかったと思い、RailsTutorial3回目は6章か始めようと思ったのでした。

演習分をコミットしておきます。

次は、第7章ユーザー登録
です。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

パーフェクトRuby 2章Rubyの基礎 2-7-3 シンボル

p61 2-7-3 シンボル シンボル好きです。Ruby始めた頃の一番最初の疑問 …

詳解 Objective-C 2.0 第3版 CHAPTER3 継承とクラス

[]多用といいメッセージキーワードといい、やっぱObjective-Cってキモチ …

Eclipse CDTインストールでCould not find

さいたまスーパーアリーナで全スサノオ使い果たし力尽きてはや1ヶ月と1週間。世の中 …

no image
iPhoneのメーラーが真っ黒になってしまった。

iPhoneのメーラーはiPhoneにデフォルトでついているメーラーを使っていま …

no image
MavericksアップデートしRuby2.0+Rails4.0.2にversion upする

何を今さら感ですが、MacはAirとMiniの2台持ちです。Airのほうを人柱と …

RailsGirls松江からのぉ〜東京More!*既に2回目

RailsGirls東京3回目に申し込みそびれた流れから松江に参加し、チューター …

WindowsキーボードをMacで使う

キーボード難民です。Mac miniでApple純正のキーボードを使っていました …

no image
RailsTutorial4.0を高速で復習する。5.3.4章。

5.3.4RSpecを洗練させる、です。 確かに、名前付きルートに書き換えていて …

初めてのRuby2章「配列とハッシュ」

Railsだってgemの一種!ってことで、Rubyの文法からちゃんとやりたいです …

no image
RailsTutorial4.0を高速で復習する。9.3.2章。

9.3.2サンプルのユーザー、です。 Faker gemで、実際にありそうなユー …