心はいつも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
iPhoneのKindleアプリでChip Conley氏の本を読んでみました。その1

GWで電子本も文庫本も読み終え、「新しい本に入れ替えないと~」と思いながらすっか …

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

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

詳解 Objective-C 2.0 第3版

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

教育のためならば、iPadアプリ料金なんて青天井ですわ

今年4月、USでのiPad発売。姪の中学入学祝いにちょうどいいなと思っていたら日 …

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

10.3.4マイクロポストを削除する、です。 仕様 マイクロポスト個別に削除でき …

画面キャプチャ系extension

現在メインブラウザはchromeを利用しています。画面キャプチャextensio …

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

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

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

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

Provisioning fileが作成できない!

iPhoneアプリを公開するために、itunes connectでProvisi …

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

7.3ユーザー登録失敗、です。 ここでは、エラーメッセージの表示を実装します。 …