###フィードの原型
今の段階では投稿した内容をすぐに見ることができません。
Homeページにまだマイクロポストを表示する部分が実装されていないからです。
####マイクロポストのステータスフィードを実装するための準備
app/models/user.rb
.
.
.
# 試作feedの定義
# 完全な実装は次章の「ユーザーをフォローする」を参照
def feed
# すべてのユーザーがフィードを持つので、feedメソッドはUserモデルで作るのが自然です
Micropost.where("user_id = ?", id)
# whereメソッド テーブル内の条件に一致したレコードを配列の形で取得することができるメソッド
# user_idを条件として取得することができる。
# 上の疑問符があることで、SQLクエリに代入する前にidがエスケープされるため
# 、SQLインジェクションと呼ばれる深刻なセキュリティホールを避けることができます。
# SQL文に変数を代入する場合は常にエスケープする習慣をぜひ身につけてください。
end
private
.
.
.
####homeアクションにフィードのインスタンス変数を追加する
app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
def home
if logged_in?
@micropost = current_user.microposts.build
@feed_items = current_user.feed.paginate(page: params[:page])
# ログインユーザーのフィード用にインスタンス変数@feed_items
end
end
def help
end
def about
# aboutアクションを作成
end
def contact
end
end
####ステータスフィードのパーシャル
app/views/shared/_feed.html.erb
<% if @feed_items.any? %>
<!--マイクロポストが複数だったら-->
<ol class="microposts">
<%= render @feed_items %>
<!--マイクロポストのページネートを表示する-->
</ol>
<%= will_paginate @feed_items %>
<% end %>
####Homeページにステータスフィードを追加する
app/views/static_pages/home.html.erb
<div class="row">
<aside class="col-md-4">
<section class="user_info">
<%= render 'shared/user_info' %>
</section>
<section class="micropost_form">
<%= render 'shared/micropost_form' %>
</section>
</aside>
<div class="col-md-8">
<h3>Micropost Feed</h3>
<%= render 'shared/feed' %>
</div>
</div>
マイクロポストの投稿が失敗すると、 Homeページは@feed_itemsインスタンス変数を期待しているため、現状では壊れてしまいます。
####createアクションに空の@feed_itemsインスタンス変数を追加する
app/controllers/microposts_controller.rb
class MicropostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
# create,destroyを行う前にログインを求めらえれる。
def create
@micropost = current_user.microposts.build(micropost_params)
# 慣習的に関連するモデルを生成するときは、buildを使う
if @micropost.save
flash[:success] = "Micropost created!"
redirect_to root_url
# redirect_to は、view の表示には直接は関係なく、新たな HttpRequest が発行されます。
else
@feed_items = current_user.feed.paginate(page: params[:page])
render 'static_pages/home'
# action で view を指定しない場合、規約に従って、リソース名 や
# action名を元に、表示する view が決まります。
end
end
def destroy
end
private
def micropost_params
params.require(:micropost).permit(:content)
# マイクロポストのcontentカラムだけ取り出すことができる。
end
end
####コントローラとアクションを明示的に設定する
app/views/shared/_feed.html.erb
<% if @feed_items.any? %>
<ol class="microposts">
<%= render @feed_items %>
<!--マイクロポストのページネートを表示する-->
</ol>
<%= will_paginate @feed_items,
params: { controller: :static_pages, action: :home } %>
<% end %>
####演習
1.
新しく実装したマイクロポストの投稿フォームを使って、実際にマイクロポストを投稿してみましょう。Railsサーバーのログ内にあるINSERT文では、どういった内容をデータベースに送っているでしょうか? 確認してみてください。
INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at")
コンソールを開き、user変数にデータベース上の最初のユーザーを代入してみましょう。その後、Micropost.where("user_id = ?", user.id)とuser.microposts、そしてuser.feedをそれぞれ実行してみて、実行結果がすべて同じであることを確認してみてください。ヒント: ==で比較すると結果が同じかどうか簡単に判別できます。
確認