心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

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

   


10.3.3フィードの原型、です。

仕様の確認

ユーザーログイン後、トップページにプロファイルが出て投稿できるようにしたが、過去のpostも一緒に表示したい。
フィードメソッドとして定義して実装する。

テストを書く

リスト10.35 (プロト) ステータスフィードのテスト。
spec/models/user_spec.rb

require 'spec_helper'

describe User do
略
  it { should respond_to(:microposts) }
  it { should respond_to(:feed) }
略
  describe "micropost associations" do

    before { @user.save }
    let!(:older_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago)
    end
    let!(:newer_micropost) do
      FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago)
    end
略
    describe "status" do
      let(:unfollowed_post) do
        FactoryGirl.create(:micropost, user: FactoryGirl.create(:user))
      end

      its(:feed) { should include(newer_micropost) }
      its(:feed) { should include(older_micropost) }
      its(:feed) { should_not include(unfollowed_post) }
    end
  end
end

実装する

リスト10.36 マイクロポストステータスフィードの実装を準備する。
app/models/user.rb

class User < ActiveRecord::Base
略
  def feed
    # このコードは準備段階です。
    # 完全な実装は第11章「ユーザーをフォローする」を参照してください。
    Micropost.where("user_id = ?", id)
  end
略
end

Micropost.where(“user_id = ?”, id)

上の疑問符があることで、SQLクエリにインクルードされる前にidが適切にエスケープされることを保証してくれるため、SQLインジェクションと呼ばれる深刻なセキュリティホールを避けることができます。この場合のid属性は単なる整数であるため危険はありませんが、SQL文にインクルードされる変数を常にエスケープする習慣はぜひ身につけてください。

テストはパスします。

テストを書く

ステータスフィード表示のテストです。

リスト10.37 ホームページのフィード表示をテストする。
spec/requests/static_pages_spec.rb

require 'spec_helper'

describe "Static pages" do

  subject { page }

  describe "Home page" do
略
    describe "for signed-in users" do
      let(:user) { FactoryGirl.create(:user) }
      before do
        FactoryGirl.create(:micropost, user: user, content: "Lorem ipsum")
        FactoryGirl.create(:micropost, user: user, content: "Dolor sit amet")
        sign_in user
        visit root_path
      end

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

実装する

リスト10.38 homeアクションにフィードのインスタンス変数を追加する。
app/controllers/static_pages_controller.rb

class StaticPagesController < ApplicationController

  def home
    if signed_in?
      @micropost  = current_user.microposts.build
      @feed_items = current_user.feed.paginate(page: params[:page])
    end
  end
略
end

リスト10.39 ステータスフィードのパーシャル。
app/views/shared/_feed.html.erb

<% if @feed_items.any? %>
  <ol class="microposts">
    <%= render partial: 'shared/feed_item', collection: @feed_items %>
  </ol>
  <%= will_paginate @feed_items %>
<% end %>

リスト10.40 単一のフィードアイテム用のパーシャル
app/views/shared/_feed_item.html.erb

<li id="<%= feed_item.id %>">
  <%= link_to gravatar_for(feed_item.user), feed_item.user %>
  <span class="user">
    <%= link_to feed_item.user.name, feed_item.user %>
  </span>
  <span class="content"><%= feed_item.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(feed_item.created_at) %> ago.
  </span>
</li>

リスト10.41 Homeページにステータスフィードを追加する。
app/views/static_pages/home.html.erb

<% if signed_in? %>
  <div class="row">
略
    <div class="span8">
      <h3>Micropost Feed</h3>
      <%= render 'shared/feed' %>
    </div>
  </div>
<% else %>
略
<% end %>

リスト10.42 createアクションに (空の) @feed_itemsインスタンス変数を追加する。
app/controllers/microposts_controller.rb

class MicropostsController < ApplicationController
略
  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end
略
end

テストはパスします。いったんコミットし、次は
10.3.4マイクロポストを削除する
です。

 - テクニカル ,

Message

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

  関連記事

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

9.3.2サンプルのユーザー、です。 Faker gemで、実際にありそうなユー …

no image
Macでアプリを強制終了

Macでアプリを強制終了したことは今までなかったのですが、どうにもftpソフトの …

ジョジョ専用kindle fire HDの電源が入らない!

電源が入らない!MacBookAirが真っ黒になりました。とか、 iPhoneの …

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

9.2.3フレンドリーフォワーディング、です。 ログオンしていないユーザーが編集 …

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

8.1.3サインインのフォーム、です。 ログイン画面を作る 入力フォームをfor …

初めてのRuby8章 8.4特異メソッドと特異クラス

特異メソッドと特異クラス プログラムなんて、クラスの継承だけで書けてしまうのが良 …

詳解 Objective-C 2.0 第3版 CHAPTER3 継承とクラス

[]多用といいメッセージキーワードといい、やっぱObjective-Cってキモチ …

no image
iPhoneのKindleアプリでChip Conley氏の本を読んでみました。その1

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

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

9.1.2編集の失敗、です。 テストを書きます リスト9.9 ユーザーupdat …

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

5.1.2BootstrapとカスタムCSS、です。 今までdivについていたイ …