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

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

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

   


11.1.4フォローしているユーザー 、です。

followed_usersとfollowersのうち、followed_usersから。

テストを書く

リスト11.9 user.followed_users属性のテスト。
spec/models/user_spec.rb

require ‘spec_helper’

describe User do
略
  it { should respond_to(:relationships) }
  it { should respond_to(:followed_users) }
略
end

実装する

リスト11.10 Userモデルのfollowed_users関連付けを追加する。
app/models/user.rb

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed
略
end

テストはパスします。

フォローのメソッドを考える

follow! #= ユーザーをフォローする。user.follow!(other_user)
following? #= ユーザーが誰かをフォローしているかどうかを確認できるようにする。

テストを書く/h2>

リスト11.11 “フォロー用の” ユーティリティメソッドをいくつかテストする。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  it { should respond_to(:followed_users) }
  it { should respond_to(:following?) }
  it { should respond_to(:follow!) }
略
  describe "following" do
    let(:other_user) { FactoryGirl.create(:user) }
    before do
      @user.save
      @user.follow!(other_user)
    end

    it { should be_following(other_user) }
    its(:followed_users) { should include(other_user) }
  end
end

メソッドを書く

リスト11.12 following?ユーティリティメソッドとfollow! ユーティリティメソッド
app/models/user.rb

class User < ActiveRecord::Base
略
  def feed
略
  end

  def following?(other_user)
    relationships.find_by(followed_id: other_user.id)
  end

  def follow!(other_user)
    relationships.create!(followed_id: other_user.id)
  end
略
end

テストはパスします。

フォロー解除のメソッドを考える

unfollow!メソッドもフォローと同様に準備する。
unfollow! #= ユーザーをフォローしていない。user.unfollow!(other_user)

テストを書く

リスト11.13 ユーザーのフォロー解除をテストする。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  it { should respond_to(:follow!) }
  it { should respond_to(:unfollow!) }
略
  describe "following" do
略
    describe "and unfollowing" do
      before { @user.unfollow!(other_user) }

      it { should_not be_following(other_user) }
      its(:followed_users) { should_not include(other_user) }
    end
略
  end
end

実装する

リスト11.14 ユーザーのリレーションシップを削除してフォロー解除する。
app/models/user.rb

class User < ActiveRecord::Base
略
  def following?(other_user)
    relationships.find_by(followed_id: other_user.id)
  end

  def follow!(other_user)
    relationships.create!(followed_id: other_user.id)
  end

  def unfollow!(other_user)
    relationships.find_by(followed_id: other_user.id).destroy
  end
略
end

テストはパスします。

11.1.5フォロワー、です。
user_has_many_followers_2nd_ed

フォロワーもフォローと同じrelationshipの仕組みで考えます。

テストを書く

リスト11.15 逆リレーションシップをテストする。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  it { should respond_to(:relationships) }
  it { should respond_to(:followed_users) }
  it { should respond_to(:reverse_relationships) }
  it { should respond_to(:followers) }
略
  describe "following" do
略
    it { should be_following(other_user) }
    its(:followed_users) { should include(other_user) }

    describe "followed user" do
      subject { other_user }
      its(:followers) { should include(@user) }
    end
略
  end
end

実装する

リスト11.16 逆リレーションシップを使用してuser.followersを実装する。
app/models/user.rb

class User < ActiveRecord::Base
略
  has_many :reverse_relationships, foreign_key: "followed_id",
                                   class_name:  "Relationship",
                                   dependent:   :destroy
  has_many :followers, through: :reverse_relationships, source: :follower
略
end

テストはパスします。

いったんコミットし、次は
11.2フォローしているユーザー用のWebインターフェイス
です。

 - テクニカル ,

Message

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

  関連記事

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

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

パーフェクトRuby 2章Rubyの基礎 2-1 Hello,Ruby

12章から5章まではPart2 Ruby言語仕様 です。 2章 Rubyの基礎 …

iPhoneアプリ開発のお勉強方法です。

Objective-C苦節3ヶ月アプリ作れるようになったと書きましたが、本日アプ …

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

6.2.1最初のユーザーテストです。ユーザーモデルをrails g modelで …

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

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

Chromeでの文字化けを対処しました。

WordPressで自作テンプレを作ってみたのはよいものの、困った問題が2つ。 …

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

10.1.4マイクロポストを改良する、です。 has_many関連付けしたので、 …

初めてのRuby8章 8.4特異メソッドと特異クラス

特異メソッドと特異クラス プログラムなんて、クラスの継承だけで書けてしまうのが良 …

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

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

パーフェクトRuby 3章制御構造/メソッド/組み込み関数 3-1演算子

パーフェクトRuby2章の後は6章をやろうと思っていましたが、やっぱり順番にやっ …