心はいつも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
Rails 3.2と4.0、複数バージョンをインストールする

Rubyを複数バージョン入れて切り替えて使える事を確認しました。次はRailsを …

40秒も待てない。

自由が丘のカフェでこれ書きました。Table Modern Service、食べ …

iPad使用前/使用後、雑感。

5/28にiPadがAppleStoreからクロネコヤマトで届けられました。 週 …

no image
テンプレとヘルパーの順番

http://yourdomain/actionxを呼んだときのactionx用 …

no image
iPad2発表

新しいiPad2がAppleより発表されました。動作は速くHDMIをサポートし、 …

アイキャッチ画像のリサイズ

768 × 1024 pxの写真をアイキャッチに指定して、150pxにリサイズ表 …

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

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

no image
railsのエラーメッセージを日本語化

message:で渡すエラーメッセージや、その他いろんな箇所を日本語化します。 …

格安で真央ごもりする浅田真央システム完成

さいたまスーパーアリーナでの世界選手権で、浅田真央ちゃんのショートプログラム世界 …

no image
Ruby 1.9系をインストールする

Rubyのバージョン管理ができるrbenvをインストールしたらいよいよRubyの …