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

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

  関連記事

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

9.1.2編集の失敗、です。 テストを書きます リスト9.9 ユーザーupdat …

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

10.3.2マイクロポストを作成する、です。 テストを書く micropostの …

no image
RailsTutorial4.0を高速で復習する。終わりました。

作りたいサービスがあってコーディング開始していたのですが、もう1回振り返り学習し …

no image
コンビニで買った携帯充電器がUSB充電ケーブルとして使えて意外に便利だった件

ITの最大苦手項目、 充電。。。特にiPhone多様するようになって以来、ガラケ …

Rubyの聖地、松江でRailsGirls Matsueに参加しました

旧暦神在月にRubyイベントに参加したい!と思ったところ、狙ったようにRubyW …

Objective-C苦節3ヶ月アプリ作れるようになった

このブログairpucci.comのメニューにアプリ開発追加しました。 昨年秋よ …

ラクダと蛇(キャメルとスネーク、Camel&Snake)

蛇。 いきなりラクダと蛇ってなんぞやー!と思う人と、あ、それかと思う人。後者はプ …

no image
Ruby1.9と2.0、複数バージョンのRubyをインストールする。

Ruby1.9 + Rails3.2もいいけど、Ruby2.0 + Rails4 …

iPhoneでのToDo&スケジュール管理アプリ決定しました

苦手なタスク管理のために読んだ2冊というエントリーが割と人気なのですが、いまだに …

パーフェクトRuby 3章制御構造/メソッド/組み込み関数 3-2 基本的な制御構造

p75 3-2 基本的な制御構造 条件分岐、繰り返し、ジャンプ構文について 3- …