Ruby on Rails Tutorial (22)

まだまだ先は長い模様。

11.1.5 Followers

User#folowers な属性追加な模様。あるいは逆引きができたりする模様。とりあえずどんどん進めてみます。spec/models/user_spec.rb に試験追加。

  it { should respond_to(:followed_users) }
  it { should respond_to(:reverse_relationships) }
  it { should respond_to(:followers) }
  it { should respond_to(:following?) }

あるいは "following" なブロックに以下を追加。

    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

reverse_relationships および followers という属性 (というかメソド) の追加確認と follower の確認ですね。なんか面白い。
List 11.16 で実装が出てるんですが以下か。

  has_many :reverse_relationships, foreign_key: "followed_id",
                                   class_name:  "Relationship",
                                   dependent:   :destroy
  has_many :followers, through: :reverse_relationships, source: :follower

とりあえず試験 red を確認しておいて確認。ちなみに relationships の定義が以下ですね。

  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed

class_name なソレを指定するのはデフォだと ReverseRelationship というクラスを探しに行くから、とのこと。むむ。名前で自動ってのもそれなりにルールを理解できてないと色々微妙ですね。
これで試験 green かと思ったら本体に盛り込んでなかった。リトライして green 確認してます。

11.2 A web interface for following users

いくつかの機能を盛り込んで 11.3 で user の status な feed を盛り込んで完了とのこと。

11.2.1 Sample following data

あ、イマサラですが rake な task って lib/tasks に云々なのか。ここも別途確認させて頂く必要がありますね。ここでは lib/tasks/sample_data.rake に Listing 11.17 の内容を盛り込むとのこと。長いので引用は略します。
更新したら以下。

$ bundle exec rake db:reset
$ bundle exec rake db:populate
$ bundle exec rake db:test:prepare

db:populate なソレは以下がその所以だったんすね。

namespace :db do
  desc "Fill database with sample data"
  task populate: :environment do

lib/tasks か。gitlab あたりも確認してみたい。つうか db:populate がオチたぞ。あ、以下になってた (汗

def make_relationsips

とほほすぎる。もっかい最初からやり直して無事終了。

11.2.2 Stats and a follow form

profile および Home な partial を、とのことなのかな。follow/unfollow なフォームを云々する前に表示を、ということらしい。なんかへろへろなのでテキストが読めないな。config/routes.rb 先頭部分を以下に修正。

SampleApp::Application.routes.draw do

  resources :users do
    member do
      get :following, followers
    end
  end

で、spec/requests/static_pages_spec.rb の修正が云々、とありますね。"for signed in users" なソレに追加なのか。

    describe "for signed-in users" do
      let(:user) { FactoryGirl.create(:user) }
      before do
        FactoryGirl.create(:micropost, user: user, content: "Lorem")
        FactoryGirl.create(:micropost, user: user, content: "Ipsum")
        sign_in user
        visit root_path
      end

      it "should render the user's feed" do
        user.feed.each do |item|
          page.should have_selector("li##{item.id}", text: item.content)
        end
      end

      describe "follower/following counts" do
        let(:other_user) { FactoryGirl.create(:user) }
        before do
          other_user.follow!(user)
          visit root_path
        end
        it { should have_link("0 following", href: following_user_path(user)) }
        it { should have_link("1 followers", href: followers_user_path(user)) }
      end
    end
  end

"follower/following counts" なブロック追加、なのかな。とりあえず試験 red を確認。て red どころか例外吐いてるぞ。標準エラーを確保してみたら config/routes.rb が微妙でした。

  resources :users do
    member do
      get :following, followers

となってましたorz
修正して試験 red を確認。

  1) Static pages Home page for signed-in users follower/following counts 
     Failure/Error: it { should have_link("0 following", href: following_user_path(user)) }
       expected link "0 following" to return something
     # ./spec/requests/static_pages_spec.rb:57:in `block (5 levels) in <top (required)>'

  2) Static pages Home page for signed-in users follower/following counts 
     Failure/Error: it { should have_link("1 followers", href: followers_user_path(user)) }
       expected link "1 followers" to return something
     # ./spec/requests/static_pages_spec.rb:58:in `block (5 levels) in <top (required)>'

かなり限界気味なんですがどんどん進めてみます。app/views/shared/_stats.html.erb は新規作成ですね。Listing 11.20 を追加とのこと。following および followers のカウントおよびそのページへのリンク、という形になってます。
で、app/views/static_pages/home.html.erb に shared/stats な render を追加してますね。

    <aside class="span4">
      <section>
        <%= render 'shared/user_info' %>
      </section>
      <section>
        <%= render 'shared/stats' %>
      </section>
      <section>
        <%= render 'shared/micropost_form' %>
      </section>
    </aside>

あるいは app/assets/stylesheets/custom.css.scss に Listing 11.22 なナニを追加とのこと。この節、盛り込みボリューム多すぎですね。app/views/users/_follow_form.html.erb を Listing 11.23 の内容で新規作成。
あと、config/routes.rb に relationships な resource が追加とのこと。

  resources :relationships, only: [:create, :destroy]

あるいは app/views/_follow.html.erb を以下で

<%= form_for(current_user.relationships.build(followed_id: @user.id)) do |f| %>
  <div><%= f.hidden_field :followed_id %></div>
  <%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>

あるいは app/views/_unfollow.html.erb が以下で新規作成。

<%= form_for(current_user.relationships.find_by_followed_id(@user),
             html: { method: :delete }) do |f| %>
  <%= f.submit "Unfollow", class: "btn btn-large" %>
<% end %>

これらのフォームの hidden な field 確認の必要あり。
上記盛り込みな app/views/users/show.html.erb 修正なのかな。Listing 11.27 で云々。このあたり。

  <aside class="span4">
    <section>
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
      </h1>
    </section>
    <section>
      <%= render 'shared/stats' %>
    </section>
11.2.3 Following and followers pages

もう少し頑張ってみます。この節末端で試験 green らしいので。
まず、spec/requests/authentication_pages_spec.rb について、Listing 11.28 を盛り込み。あるいは spec/requests/user_pages_spec.rb について Listing 11.29 を盛り込みます。末端にざっくり盛り込みなんですね。
試験 red 確認とかスルーで次に app/controllers/users_controller.rb に Listing 11.30 を盛り込みます。もう一つ、app/views/users/show_follow.html.erb を Listing 11.31 で新規作成。
これで試験 green って記述があるんですが本当かなぁ。

試験パスしとる

ここ、特に色々再確認の必要あり、ですね。
今日は色々な意味でへろへろなのでこれで終了。