らくだ🐫にもできるRailsチュートリアル|2.3(と2.4)

2.3 Micropostsリソース

2.3.1 マイクロポストを探検する

Usersリソースの時と同様にmicropostsリソースを生成する

$ rails generate scaffold Micropost content:text user_id:integer
#content:text user_id:integer を持つMicropostsリソースをscaffoldで生成
・
・
・
$ rails db:migrate
#生成されたファイルに則りデータベースを設定するコマンド
・
・
・
Rails.application.routes.draw do
  #Micropostsリソース用のルール
  resources :microposts
  resources :users
  root 'users#index'
end

scaffoldでMicropostsリソースを生成したのでroutesファイルが更新されている外、
controllerやviewファイルも自動生成されている

マイクロポストを作成してみる

/microposts/newにアクセスしていくつか投稿してみる

演習

CSSを知っている読者へ: 新しいマイクロポストを作成し、ブラウザのHTMLインスペクター機能を使って「Micropost was successfully created.」の箇所を調べてみてください。ブラウザをリロードすると、その箇所はどうなるでしょうか?

<p id="notice">Micropost was successfully created.</p>
#↑これが↓こうなる
<p id="notice"></p>

マイクロポストの作成画面で、ContentもUserも空にして作成しようとするどうなるでしょうか?

どちらも問題なく登録できてしまう(本来は良くないのでエラーになりたい)

141文字以上の文字列をContentに入力した状態で、マイクロポストを作成しようとするとどうなるでしょうか? (ヒント: WikipediaのRubyの記事にある1段落目がちょうど150文字程度ですが、どうなりますか?)

問題なく登録できてしまう(本来は良くないのでエラーになりたい)

上記の演習で作成したマイクロポストを削除してみましょう。

/micropostsの一覧表示にあるdeleteボタンを使って削除

2.3.2 マイクロポストをマイクロにする

文字数の制限

class Micropost < ApplicationRecord
  #データのチェック :検証するカラム名, 検証内容
  validates :content, length: { maximum: 140 }
end

バリデーション = 検証 設定した内容に該当しない場合、データベースに保存されずエラーになる
この場合、contentsカラムの内容が最大140文字を超えるとエラーになる

演習

先ほど2.3.1.1の演習でやったように、もう一度Contentに141文字以上を入力してみましょう。どのように振る舞いが変わったでしょうか?

エラー表示が出て投稿できなくなっている

CSSを知っている読者へ: ブラウザのHTMLインスペクター機能を使って、表示されたエラーメッセージを調べてみてください。

#エラーメッセージを表示させるためのerror_explanationというidのdivが作られている
<div id="error_explanation">
  #Micropostを保存する際に1つのエラーが出ています的な見出し
  <h2>1 error prohibited this micropost from being saved:</h2>
  <ul>
    #コンテンツが長すぎ(最大140文字だよ)的なメッセージ
   <li>Content is too long (maximum is 140 characters)</li>
  </ul>
</div>

2.3.3 ユーザーはたくさんマイクロポストを持っている

class User < ApplicationRecord
  #「1人のuserは複数のmicropostsを持っている」と言う関連付け
  has_many :microposts
end

「has_many」↑と↓「belongs_to」は対になっている

class Micropost < ApplicationRecord
  #「一つのmicropostは一人のuserにのみ属する」と言う関連付け
  belongs_to :user
  validates :content, length: { maximum: 140 }
end

この関連付けをすることで
「user_idが1のmicropostsをすべて表示する」
「このmicropostの投稿者のUserページを表示する」などの動作を付けられるようになる。

rails console

#コンソールを起動「rails c」でもOK
$ rails console
#first_user に Userテーブルにある1番目のデータを代入
> first_user = User.first
  User Load (0.1ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
 => #"ももちゃん", email: "momo@mail.com", created_at: "2019-05-11 10:00:18", updated_at: "2019-05-11 10:00:18"> 
#first_userのmicroposts(全て)
> first_user.microposts
  Micropost Load (0.1ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? LIMIT ?  [["user_id", 1], ["LIMIT", 11]]
#user_idが1の投稿は2つ作ってあったので2つ表示されている
 => #"に ゃーん", user_id: 1, created_at: "2019-05-18 07:05:46", updated_at: "2019-05-18 07:05:46">, #"Secondにゃーん", user_id: 1, created_at: "2019-05-18 07:07:13", updated_at: "2019-05-18 07:07:13">]> 
#micropost に first_userの1番目のmicropostを代入
> micropost = first_user.microposts.first
  Micropost Load (0.2ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? ORDER BY "microposts"."id" ASC LIMIT ?  [["user_id", 1], ["LIMIT", 1]]
 => # "にゃーん", user_id: 1, created_at: "2019-05-18 07:05:46", updated_at: "2019-05-18 07:05:46"> 
#micropostのuser
> micropost.user
 => #"ももちゃん", email: "momo@mail.com", created_at: "2019-05-11 10:00:18", updated_at: "2019-05-11 10:00:18"> 
#コンソールの終了
> exit(もしくはctrl+d)

演習

ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。

・
・
・
<p>
  <strong>Email:</strong>
  <%= @user.email %>
</p>
<p>
  <strong>Microposts:</strong>
  #@userのmicropostsの1番目のcontentを表示
  <%= @user.microposts.first.content %>
  #因みにらくだ🐫は最初「@user.microposts.first」にしてしまいいました。惜しい!
</p>
・
・
・

表示できました!

(User_idが2の投稿もあるので、/users/2にもmicropostが表示されていました)

リスト 2.16は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう (図 2.16のようになっていると成功です)。

class Micropost < ApplicationRecord
  belongs_to :user
  validates :content, length: { maximum: 140 }, presence: true
  #本文では改行表示されているけど実際にはこういう一文なので
  #文字数のバリデーションの後に区切りの「,」を忘れないこと!
end

リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください (図 2.17)。

class User < ApplicationRecord
  has_many :microposts
  validates :name, presence: true 
  validates :email, presence: true 
  #「:」を忘れずに!
end

2.3.4 継承の階層

本文ママ

演習

Applicationコントローラのファイルを開き、ApplicationControllerがActionController::Baseを継承している部分のコードを探してみてください。

class ApplicationController < ActionController::Base
#↑ここ
  protect_from_forgery with: :exception

  def hello
    render html: "hello,world!"
  end
end

ApplicationRecordがActiveRecord::Baseを継承しているコードはどこにあるでしょうか? 先ほどの演習を参考に、探してみてください。ヒント: コントローラと本質的には同じ仕組みなので、app/modelsディレクトリ内にあるファイルを調べてみると…?)

class ApplicationRecord < ActiveRecord::Base
#↑ここ
  self.abstract_class = true
end

2.3.5 アプリケーションをデプロイする

本文ママ
また、2.3.3.1の実習内容がそのままだったので
show.html.erbに追加したMicropoft表示用のコードをコメントアウトして再push

演習

本番環境で2〜3人のユーザーを作成してみましょう。

Herokuのアプリを開いて、名前とメールを入力してボタンをクリック。
所がエラー表示!

ログを確認しろとの事なのでターミナルから確認します

$ heroku logs
・
・
・
2019-05-19T10:46:09.270406+00:00 app[web.1]: F, [2019-05-19T10:46:09.270345 #4] FATAL -- : [ac9b9900-76f4-4689-8fd7-62656c2eedde]
2019-05-19T10:46:09.270500+00:00 app[web.1]: F, [2019-05-19T10:46:09.270443 #4] FATAL -- : [ac9b9900-76f4-4689-8fd7-62656c2eedde] app/views/users/show.html.erb:15:in `_app_views_users_show_html_erb__2106187406813746292_69896532737100'
・
・
・

怪しい部分を教えてくれます。ありがたや。
そしてapp/views/users/show.html.erbの15行目と言うのが先ほどコメントアウトしたMicropoft表示用のコード
はて?コメントアウトはいかんのか?と思いつつ、削除して再push
/users/show.html.erbが無事表示されました※URLは/users/3(user_id)

2,3については動作確認のみ、エラーなしだったので省略

2.4 最後に

まとめなので省略

まとめとか感想

基本的には2.2の復習的な内容だったのでさほど詰まらず
エラーもあったけどサクっと対応できたので良かったでした。

らくだ🐫にもできるRailsチュートリアルとは

「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。

調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです