これまでのあらすじ
ここまでRailsチュートリアルをやってきましたが僕はもうだめです。だめぽです。探さないでください。やはり社会の底辺が人生逆転をかけてRailsチュートリアルなんてやるべきではなかったんです。
おわり
さて、第十三章をやっていきます。この章でTwitterクローン的なやつがつくれるそうです。へー(興味なし)。
マイクロポストモデルをつくろう
まずは何はともあれマイクロポストのモデルをつくります。
$ rails generate model Micropost content:text user:references $ rails db:migrate
とりあえずモデルを作ったらuser_id
とcontent
を追加します。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
これで以下のような側が作れます。
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
前回分けるか分けないか悩んでるっていったけども分けることにした。やっぱり後半になってきてやる気がなくなっ難しくなってきたしで分割したほうがいいと判断しました。
そんなわけで次回マイクロポストを操作していきます。なるはやで……。
つづく。