1
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.

アプリをつくる マイクロポストを表示する

Posted at

###マイクロポストコントローラを生成

ubuntu:~/environment/my_app (user-microposts) $ rails generate controller Microposts
Running via Spring preloader in process 4323
      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

###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.
  </span>
</li>

1つのマイクロポストを表示するパーシャル

###app/controllers/users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: :destroy
  
  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
    # マイクロポストのインスタンス変数
    # マイクロポストにページネーションを作る
      # page: params[:page]の意味がわからん
      # デフォルトで30件
  end
 
  def new
    @user = User.new
  end
  
  def create
    @user = User.new(user_params) 
    if @user.save
      @user.send_activation_email
      # メソッドを使ってメールを送信する
      flash[:info] = "メールをチェックしてアカウントを有効にしてください。"
      redirect_to root_url
    else
      render 'new'
    end
  end
  
  def edit
    @user = User.find(params[:id])
  end
  
  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      flash[:success] = "プロフィールを更新しました。"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "ログアウトされました。"
    redirect_to users_url
  end
  
  private
  
    def user_params
      params.require(:user).permit(:name, :email, :password, 
                                     :password_confirmation)
    end
    
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "ログインしてください。"
        redirect_to login_url
      end
    end
    
    # 正しいユーザーかどうか確認
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless @user == current_user
    end
    
    # 管理者かどうか確認
    def admin_user
      redirect_to(root_url) unless current_user.admin?
    end
end

###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? %>
      <h3>Microposts (<%= @user.microposts.count %>)</h3>
        <!--@user.microposts.conut
              マイクロポストの数を表示
        -->
      <ol class="microposts">
        <%= render @microposts %>
          <!--一つのマイクロポストを表示させるパーシャル-->
      </ol>
      <%= will_paginate @microposts %>
        <!--micropostコントローラでページネーションを作成されている。-->
    <% end %>
  </div>
</div>

###db/seeds.rb

# メインのサンプルユーザーを1人作成する
User.create!(name:  "Example User",
             email: "example@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar",
             admin: true,
             activated: true,
             activated_at: Time.zone.now)

# 追加のユーザーをまとめて生成する
99.times do |n|
  name  = Faker::Name.name
  email = "example-#{n+1}@railstutorial.org"
  password = "password"
  User.create!(name:  name,
               email: email,
               password:              password,
               password_confirmation: password,
               activated: true,
               activated_at: Time.zone.now)
               
# ユーザーの一部を対象にマイクロポストを生成する
users = User.order(:created_at).take(6)
# dbから作成時刻に並び替えて6件のレコードを取得(多分、昇順)
  # .take()
    # モデル.take(件数=nil)
    # 引数で指定した件数のレコードを取得
50.times do
# 50回以下の処理を行う
  content = Faker::Lorem.sentence(word_count: 5)
  # 5文字のダミーデータを返す
    # Faker:: 
      # ダミーデータを作成できる
      # ------------------------------
      # 2.6.3 :001 > Faker::Address.city
      # => "Greenborough" 
      # 2.6.3 :002 > Faker::Address.city
      # => "Raynorshire" 
      # ------------------------------
      # ランダムでデータを出してくれる

    # Lorem.sentence(word_count: 5)
      # Lorem ダミーテキスト「lorem ipsum」の略。
      # word_count: 5
        # 5文字
users.each { |user| user.microposts.create!(content: content) }
# 6件から一つづつ取り出す
  # |user|はeach文で変数を表す
    # -----------------------------
    # range = 5..10
      #=> 5..10 
    # 2.6.3 :004 > range.each{|num|
    # 2.6.3 :005 >       print("num = ", num)
    # 2.6.3 :006?>   }
    #   num = 5num = 6num = 7num = 8num = 9num = 10 => 5..10 
    # -----------------------------   
end

###データベースをリセットする 再び生成する

$ rails db:migrate:reset
$ rails db:seed

###app/assets/stylesheets/custom.scss

.
.
.
/* microposts */

.microposts {
  list-style: none;
  padding: 0;
  li {
    padding: 10px 0;
    border-top: 1px solid #e8e8e8;
  }
  .user {
    margin-top: 5em;
    padding-top: 0;
  }
  .content {
    display: block;
    margin-left: 60px;
    img {
      display: block;
      padding: 5px 0;
    }
  }
  .timestamp {
    color: $gray-light;
    display: block;
    margin-left: 60px;
  }
  .gravatar {
    float: left;
    margin-right: 10px;
    margin-top: 5px;
  }
}

aside {
  textarea {
    height: 100px;
    margin-bottom: 5px;
  }
}

span.image {
  margin-top: 10px;
  input {
    border: 0;
  }
}

cssは後でやる

###プロフィール画面のマイクロポストをテスト(統合テスト)を生成

ubuntu:~/environment/my_app (user-microposts) $ rails generate integration_test users_profile
Running via Spring preloader in process 8805
      invoke  test_unit
      create    test/integration/users_profile_test.rb

未だに統合テストの使い所がわからない

###test/fixtures/microposts.yml テストデータを作成

orange:
  content: "I just ate an orange!"
  created_at: <%= 10.minutes.ago %>
  user: michael

tau_manifesto:
  content: "Check out the @tauday site by @mhartl: https://tauday.com"
  created_at: <%= 3.years.ago %>
  user: michael

cat_video:
  content: "Sad cats are sad: https://youtu.be/PKffm2uI4dk"
  created_at: <%= 2.hours.ago %>
  user: michael

most_recent:
  content: "Writing a short test"
  created_at: <%= Time.zone.now %>
  user: michael
  
<% 30.times do |n| %>
# 30回以下の処理を繰り返す
micropost_<%= n %>:
  content: <%= Faker::Lorem.sentence(word_count: 5) %>
  # ダミーのテキストを生成(5単語以内)
  created_at: <%= 42.days.ago %>
  # 作成日 42日前
  user: michael
<% end %>

###test/integration/users_profile_test.rb

require 'test_helper'

class UsersProfileTest < ActionDispatch::IntegrationTest
  include ApplicationHelper

  def setup
    @user = users(:michael)
    # テストユーザーをインスタンス変数に返す
  end

  test "profile display" do
    get user_path(@user)
    # ユーザーページを表示を要求する
      # showアクションが作動する
    assert_template 'users/show'
    # ユーザーページが表示されたか確かめる
    assert_select 'title', full_title(@user.name)
    # タイトルタグにユーザーの名前が表示されているか確かめる
    assert_select 'h1', text: @user.name
    assert_select 'h1>img.gravatar'
    # わからない
    assert_match @user.microposts.count.to_s, response.body
    # 
    assert_select 'div.pagination'
    @user.microposts.paginate(page: 1).each do |micropost|
      assert_match micropost.content, response.body
    end
  end
end

###テストをする

ubuntu:~/environment/my_app (user-microposts) $ rails t
/home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-6.0.3/lib/abstract_controller/helpers.rb:152:in `rescue in block in modules_for_helpers': Missing helper file helpers/microposts_helper.rb (AbstractController::Helpers::MissingHelperError)
        from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/actionpack-6.0.3/lib/abstract_controller/helpers.rb:149:in `block in modules_for_helpers'
.
.
.        
2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from -e:1:in `<main>'
ubuntu:~/environment/my_app (user-microposts) $ spring stop
Spring stopped.
ubuntu:~/environment/my_app (user-microposts) $ rails t
Running via Spring preloader in process 10696
Run options: --seed 32403

# Running:

.........................................

Finished in 9.348758s, 4.3856 runs/s, 27.0624 assertions/s.
41 runs, 253 assertions, 0 failures, 0 errors, 0 skips

spring stopで解消
意味はわからない

1
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
1
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?