###マイクロポストコントローラを生成
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で解消
意味はわからない