心はいつも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

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

  関連記事

詳解 Objective-C 2.0 第3版

Rubyの言語仕様を勉強する傍ら、Objective-Cも言語仕様ベースで勉強し …

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

11.1.4フォローしているユーザー 、です。 followed_usersとf …

no image
ヘルパーメソッドを自作する

便利なrailsのヘルパーメソッド。自分でも作れます。 作るときは、 アプリのd …

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

6.2.5一意性を検証する、です。メールアドレスをIDとして使うため(でなくとも …

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

8.2.1[このアカウント設定を保存する]、です。 RailsTutorial4 …

もうあかん!Mac OSXのスクロールを逆にする

OSXのいつのバージョンからだっけ? スクロールの向きが突如逆になったんですよね …

no image
Homebrewをインストールする。

MacOS 10.8.5(Mountain Lion)にRuby&Ru …

no image
accepts_nested_attributes_for

everydayRailsやっていて、 phoneモデルのテストのところで ac …

no image
RailsTutorial4.0を高速で復習する。4.1章の途中から。

さて、4.1章の途中にある、変だなと思っている箇所、 リスト4.4 Homeペー …

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

演習1問目。 リスト6.20の、メールアドレスを小文字に変換するコードに対するテ …