コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

社会のボトムズがRailsに手を出す #13-1

これまでのあらすじ

ここまでRailsチュートリアルをやってきましたが僕はもうだめです。だめぽです。探さないでください。やはり社会の底辺が人生逆転をかけてRailsチュートリアルなんてやるべきではなかったんです。



おわり


前回記事
inujini.hatenablog.com



さて、第十三章をやっていきます。この章でTwitterクローン的なやつがつくれるそうです。へー(興味なし)。



マイクロポストモデルをつくろう

まずは何はともあれマイクロポストのモデルをつくります。

$ rails generate model Micropost content:text user:references
$ rails db:migrate

とりあえずモデルを作ったらuser_idcontentを追加します。add_index :microposts, [:user_id, :created_at]、こう書くと両方のキーを同時に扱うようになるらしい。

それと、モデル同士の関連付けとかの話になってきて、ようやくApplicationRecord便利なのかもしれないってなってきた。
参考
Active Record の関連付け (アソシエーション) | Rails ガイド
Active Record クエリインターフェイス | Rails ガイド

# app/models/micropost.rb
class Micropost < ApplicationRecord
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
end

ちなみにテストは以下。

# test/models/micropost_test.rb
require 'test_helper'
class MicropostTest < ActiveSupport::TestCase
  def setup
    @user = users(:michael)
    @micropost = Micropost.new(content: "Lorem ipsum", user_id: @user.id)
  end

  test "正しい" do
    assert @micropost.valid?
  end

  test "ユーザIDが存在する" do
    @micropost.user_id = nil
    assert_not @micropost.valid?
  end

  test "コンテンツは存在する" do
    @micropost.content = "   "
    assert_not @micropost.valid?
  end

  test "140文字字数制限" do
    @micropost.content = "a" * 141
    assert_not @micropost.valid?
  end
end
マイクロポストを表示しよう

そうしたらガワの方を作っていきます。

$ rails generate controller Microposts
# Fakerダミー作成後
$ rails db:migrate:reset
$ rails db:seed
# db/seeds.rb
# Fakerダミー
### いろいろ略 ###
users = User.order(:created_at).take(6)
50.times do
  content = Faker::Lorem.sentence(5)
  users.each { |user| user.microposts.create!(content: content) }
end

これで以下のような側が作れます。
f:id:andron:20190122213921p:plain
Faker::Lorem.sentence(5)のおかげで良い感じにやばいやつになってますね。


プロフィール画面のマイクロポストのテストは以下。

$ rails generate integration_test users_profile
# test/integration/users_profile_test.rb
require 'test_helper'
class UsersProfileTest < ActionDispatch::IntegrationTest
  include ApplicationHelper
  def setup
    @user = users(:michael)
  end

  test "プロフィール表示" do
    get user_path(@user)
    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
To Be Continue

前回分けるか分けないか悩んでるっていったけども分けることにした。やっぱり後半になってきてやる気がなくなっ難しくなってきたしで分割したほうがいいと判断しました。

そんなわけで次回マイクロポストを操作していきます。なるはやで……。


つづく。