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

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

  関連記事

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

11.3ステータスフィード、です。 11.3.1動機と計画、です。 仕様 mic …

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

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

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

テストコードが長くなったからリファクタリングするかも、、といいながら、静的ページ …

railsでtest unitを生成させない

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

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

10.2マイクロポストを表示する、です。 ポストの投稿ではなく、表示だけを先に作 …

MacにGUIのSQLite3クライアントを入れる。

ターミナルからコマンドたたけばいいだけですが、DBスキーマをちょっと確認したいと …

iPadのiBooksで自炊とかしたPDFの電子書籍を読む

手順覚えないのでブログに書きます。 Bookscan使用して手持ちPDF電子書籍 …

no image
Ruby on Railsのインストール

Rubyのアップデートが終わったので、いよいよRailsをインストールします。 …

no image
wordpressはじめます

ブログを立ち上げるのは久しぶりです。 以前から、ブログメディアをやりたいと思って …

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

6.2.3長さを検証する、です。空データを拒否した次は、入力できるデータ長の制限 …