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

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

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

   


10.1.4マイクロポストを改良する、です。

has_many関連付けしたので、user.micropostsメソッドが実際にマイクロポストの配列を返すことをテストします。

テストを書く

リスト10.9 マイクロポスト作成用の新しいファクトリーを含む、完全なFactoryファイル。
spec/factories.rb

FactoryGirl.define do
  factory :user do
    sequence(:name)  { |n| "Person #{n}" }
    sequence(:email) { |n| "person_#{n}@example.com"}
    password "foobar"
    password_confirmation "foobar"

    factory :admin do
      admin true
    end
  end

  factory :micropost do
    content "Lorem ipsum"
    user
  end
end

投稿は日付の新しい順に並べるので、そのテストも書きます。

リスト10.10 ユーザーのマイクロポストの順序をテストする。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  describe "micropost associations" do

    before { @user.save }
    let!(:older_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
    end
    let!(:newer_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
    end

    it "should have the right microposts in the right order" do
      expect(@user.microposts.to_a).to eq [newer_micropost, older_micropost]
    end
  end
end

モデルを実装する

投稿を日付順に並べます。

ポスト10.11 default_scopeでマイクロポストを順序付ける。
app/models/micropost.rb

class Micropost < ActiveRecord::Base
  belongs_to :user
  default_scope -> { order('created_at DESC') }
  validates :user_id, presence: true
end

ここで2つわからないことが出てきています。

Rails 4.0からは、あらゆるスコープは、スコープで必要な域値を返す無名関数を受け取ります。これにより、スコープをその場で評価する必要がほぼなくなり、後に読み込まれたときに必要に応じて評価するようになります (いわゆる遅延評価 (lazy evaluation) です)。上のコードの場合、以下がその関数です。

-> { order(‘created_at DESC’) }

この種のオブジェクトの構文は、Proc (手続き: procedure) とかラムダ (lambda)と呼ばれ、->という矢印で表されます。この構文はブロック (4.3.2) を引数に取り、後にcallメソッドによって呼び出されるときにブロックを実際に評価します。

まず、スコープについて。
データベースのデータの取り扱いを決めるようなものっぽいですが、検索しても説明がなかなか出てきません。DBのviewを作るものではなく、あくまでも順序や取り扱い範囲を定義しているものがscopeっぽいです。よく利用する検索条件をあらかじめ準備(scope)とのこと。

次、Proc (手続き: procedure) とかラムダ (lambda)について。
オブジェクトではないものをオブジェクト扱いする表記らしいのですが、一貫した説明がみつからない。ブロックをオブジェクト化したものがProc。

テストはパスしました。

ユーザー削除のテストを書く

ユーザーが破棄された場合、ユーザーのマイクロポストも同様に破棄されるべきという仕様に基づき、テストを書きます。データ削除は論理削除でもいいと思うのですが、RailsTutorialでは物理削除です。

リスト10.12 ユーザーを破棄するとマイクロポストも破棄されることをテストする。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  describe "micropost associations" do

    before { @user.save }
    let!(:older_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
    end
    let!(:newer_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
    end
略
    it "should destroy associated microposts" do
      microposts = @user.microposts.to_a
      @user.destroy
      expect(microposts).not_to be_empty
      microposts.each do |micropost|
        expect(Micropost.where(id: micropost.id)).to be_empty
      end
    end
  end
end

実装する

リスト10.13 ユーザーのマイクロポストがユーザーと一緒に破棄されることを保証するコード。
app/models/user.rb

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
略
end

テストはパスします。

10.1.5コンテンツの検証、です。

テストを書く

マイクロポストが140文字以内という仕様を加え、content属性の存在もテストします。

リスト10.14 Micropostモデルの検証のテスト。
spec/models/micropost_spec.rb

require 'spec_helper'

describe Micropost do

  let(:user) { FactoryGirl.create(:user) }
  before { @micropost = user.microposts.build(content: "Lorem ipsum") }
  .
  .
  .
  describe "when user_id is not present" do
    before { @micropost.user_id = nil }
    it { should_not be_valid }
  end

  describe "with blank content" do
    before { @micropost.content = " " }
    it { should_not be_valid }
  end

  describe "with content that is too long" do
    before { @micropost.content = "a" * 141 }
    it { should_not be_valid }
  end
end

もう、テストは中身も見ずコピペみたいになってきた。。

実装する

リスト10.15 Micropostモデルの検証。
app/models/micropost.rb

class Micropost < ActiveRecord::Base
  belongs_to :user
  default_scope -> { order('created_at DESC') }
  validates :content, presence: true, length: { maximum: 140 }
  validates :user_id, presence: true
end

userで実装したのと同様です。

テストはパスします。

いったんコミットして、次は
10.2マイクロポストを表示する
です。

 - テクニカル ,

Message

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

  関連記事

Macにコマンドラインツールをインストールする

Mac miniのメモリが16Mになったので、気分も新たに、Ruby on Ra …

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

3.3.3埋め込みRubyです。viewにrubyコードを埋め込んでtitleを …

詳解 Objective-C 2.0 第3版 CHAPTER4 オブジェクトの型と動的結合

CHAPTER4は「オブジェクトの型と動的結合」なんだけど、 動的結合ってなに? …

Railsを立ち上げる

RubyのアップデートとRailsのインストールが無事終わったので、いよいよRa …

no image
Everyday Rails3章 バリデーションをテストする

さっき、Aaronを削除したらテスト失敗することを確認しましたが、名前入力無しの …

no image
destory

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

no image
editとupdate

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

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

7.6演習 1問目です。 リスト7.30のコードを使用して、7.1.4で定義され …

no image
テンプレとヘルパーの順番

http://yourdomain/actionxを呼んだときのactionx用 …

no image
RailsTutorial4.0を高速で復習する。5.6章。演習2問目のつづき。

5.6章。演習2問目です。TDDにこだわり、あえてこの問題をするまで、ヘッダーや …