0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

railsチュートリアル第十三章 フィードの原型

Posted at

###フィードの原型
今の段階では投稿した内容をすぐに見ることができません。
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をそれぞれ実行してみて、実行結果がすべて同じであることを確認してみてください。ヒント: ==で比較すると結果が同じかどうか簡単に判別できます。

確認

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?