Ruby on Rails Tutorial (18)

朝練の続きに着手。

10.2 Showing microposts

user profile なページから micropost を投入する形を取る模様。

10.2.1 Augmenting the user show page

user の micropost の表示から試験を、とのこと。

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
    let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }

    before { visit user_path(user) }

    it { should have_selector('h1',    text: user.name) }
    it { should have_selector('title', text: user.name) }

    describe "microposts" do
      it { should have_content(m1.content) }
      it { should have_content(m2.content) }
      it { should have_content(user.microposts.count) }
    end
  end

そのまんまと言えばそのまんまですね。ちなみに profile page な試験は既存のものです。とりあえず試験 red を確認して show.html.erb への盛り込みを開始。
以下を追加か。

  <div class="span8">
    <% if @user.microposts.any? %>
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
      <ol class="microposts">
        <%= render @microposts %>
      </ol>
      <%= will_paginate @microposts %>
    <% end %>
  </div>

追加後に試験リトライ。あら、試験 red 終了ですね。盛り込みが足りていないのか。
確かに app/controllers/users_controller.rb の該当部分の記述は以下ですね。

  def show
    @user = User.find(params[:id])
  end

will_paginate な @microposts の記述がありません。以下を盛り込むと green になるのかどうか。

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
  end

ありゃ、試験 red ですね。別なところに原因がある模様。あ、以下な app/views/microposts/_micropost.html.erb の追加も必要なのか。

<%= render @microposts %>

は partial なソレ、って意味だったんすね。

<li>
  <span class="content"><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  </span>
</li>

あら、違うな。ちゃんとテキスト読めてないなorz
この時点では試験はパスしない、ってことにして先に進もう。

10.2.2 Sample microposts

micropost なデータを追加なのか。試験はスルーで確認したら解説の通りではあります。lib/tasks/sample_data.rake の末端に以下を追加。

    users = User.all(limit: 6)
    50.times do
      content = Faker::Lorem.sentence(5)
      users.each { |user| user.microposts.create!(content: content) }
    end

で、test な DB を更新。

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

WEBrick 再起動して w3m で確認。一応 30 件くらいの表示が確認できますね。試験を再度実行してみます。どうなるか。まだ red 終了だな。おかしいな。
スルーした方が良いのかどうか分からぬまま一旦置きます。

追記

let に ! が付いてませんでしたorz

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    let(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
    let(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }

以下に修正して green 終了確認。とほほ。

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") }
    let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") }