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チュートリアル第13章 マイクロポストを表示する

Posted at

##マイクロポストを表示する
ユーザーのshowページで直接マイクロポストを表示させる
最初に極めてシンプルなERbテンプレートを作成します。
サンプルデータ生成タスクにマイクロポストのサンプルを追加して、画面にサンプルデータが表示されるようにしてみます。

###マイクロポストの描画
Micropostのコントローラとビューを作成するために、コントローラを生成しましょう。

ubuntu:~/environment/sample_app (user-microposts) $ rails generate controller Microposts
Running via Spring preloader in process 3861
      create  app/controllers/microposts_controller.rb
      invoke  erb
      create    app/views/microposts
      invoke  test_unit
      create    test/controllers/microposts_controller_test.rb
      invoke  helper
      create    app/helpers/microposts_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/microposts.scss

今回の目的は、ユーザー毎にすべてのマイクロポストを描画できるようにする

###1つのマイクロポストを表示するパーシャル
app/views/microposts/_micropost.html.erb

<li id="micropost-<%= micropost.id %>">
  <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
  <span class="user"><%= link_to micropost.user.name, micropost.user %></span>
  <span class="content"><%= micropost.content %></span>
  <span class="timestamp">
    Posted <%= time_ago_in_words(micropost.created_at) %> ago.
    <!--メソッド名の表すとおりですが、「3分前に投稿」といった文字列を出力します。-->
  </span>
</li>

###@micropostsインスタンス変数をshowアクションに追加する
app/controllers/users_controller.rb

class UsersController < ApplicationController
.
.
.
def show
    @user = User.find(params[:id])
    # データベースからユーザー情報を取り出す
    @microposts = @user.microposts.paginate(page: params[:page])
    # @microposts変数をwill_paginateに渡す必要なためここで定義しなければならない。
    # Usersコントローラのコンテキストにおいて、
    #   @usersインスタンス変数が存在していることを前提としているため
.
.
.
end

####マイクロポストをユーザーのshowページ(プロフィール画面)に追加する
app/views/users/show.html.erb

<% provide(:title, @user.name) %>
<div class="row">
<!--サイドバーを表示させる-->
  <aside class="col-md-4">
  <!--サイドバーを表示させる-->
    <section class="user_info">
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
      </h1>
    </section>
  </aside>
  <div class="col-md-8">
    <% if @user.microposts.any? %>
    <!--ユーザーのマイクロポストが1つもない場合には空のリストを表示させていない-->
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
      <!--マイクロポストの数を数える-->
      <ol class="microposts">
      <!--ol マイクロポストが特定の順序(新しい→古い)に依存しているため-->
        <%= render @microposts %>
        <!--マイクロポストを表示させる-->
      </ol>
      <%= will_paginate @microposts %>
      <!--マイクロポストをページネーション-->
    <% end %>
  </div>
</div>

###演習
1.
7.3.3で軽く説明したように、今回ヘルパーメソッドとして使ったtime_ago_in_wordsメソッドは、Railsコンソールのhelperオブジェクトから呼び出すことができます。このhelperオブジェクトのtime_ago_in_wordsメソッドを使って、3.weeks.agoや6.months.agoを実行してみましょう。

>> helper.time_ago_in_words(3.weeks.ago)
=> "21 days"
>> helper.time_ago_in_words(6.weeks.ago)
=> "about 1 month"

2.helper.time_ago_in_words(1.year.ago)と実行すると、どういった結果が返ってくるでしょうか?

>> helper.time_ago_in_words(1.year.ago)
=> "about 1 year"

3.micropostsオブジェクトのクラスは何でしょうか? ヒント: リスト 13.23内のコードにあるように、まずはpaginateメソッド(引数はpage: nil)でオブジェクトを取得し、その後classメソッドを呼び出してみましょう。

>> microposts = user.microposts.paginate(page: nil)
  Micropost Load (0.7ms)  SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."created_at" DESC LIMIT ? OFFSET ?  [["user_id", 1], ["LIMIT", 11], ["OFFSET", 0]]
=> #<ActiveRecord::AssociationRelation []>

>> microposts.class
=> Micropost::ActiveRecord_AssociationRelation

クラスは大事らしい。

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?