【Ruby on Rails】ドットインストールRuby on Rails 5入門まとめ【プログラミング学習79日目】

# はじめに
初心者が学びの内容を言語化することで、学習の中で得た知識やスキルを深化させることを目的としている記事です。

今回はドットインストールRuby on Rails 5入門編の各章のまとめを備忘録として記録していきます。

# ドットインストール・Ruby on Rails 5入門の内容

## #01 Ruby on Railsを使ってみよう
＜バージョン確認等のコマンド＞
・`$ pwd`：現在操作しているディレクトリを確認
・`$ ruby -v：Ruby`のバージョン確認
・`$ sqlite3 --version`：SQLiteのバージョン確認
・`$ rails -v`：Railsのバージョン確認

＜Railsのインストール＞
・RubyのパッケージシステムであるGemで管理されている
・`$ gem install rails`
・`$ gem install rails --no-document`とするとインストール時間を短縮可能

##  #02 動作確認をしてみよう
＜Webサーバーの立ち上げ＞
・`$ rails new myapp`：myappというディレクトリを作成し、その中に必要なファイルを作成してくれる
・`$ cd ディレクトリ名`：ディレクトリに移動
・`$ ip a`：IPアドレスを取得（例、192.168.33.10）
・`$ rails server -b IPアドレス -d`と入力、-dはバックグラウンドで動かすために記述
・ブラウザに`http://IPアドレス:3000 `と入力、Rails初期画面が出たらOK

＜Webサーバーの停止＞
・`$ cat tmp/pids/server.pid`と入力してプロセス番号を調べる
・`$ kill -9 プロセス番号`と入力したらプロセス終了

＜ログの見方＞
・`$ tail log/development.log`
・エラーが出たときに調べることがある

## #03 Scaffoldを使ってみよう
＜簡単なWebアプリの作成＞
・`$ rails g scaffold  Memo title:string body:text`：ファイルが作られる
・`$ rails db:migrate`：データベースに反映
・(豆知識)scaffold：足場を作る

＜Webサーバーの終了、別パターン＞
・RailsではpumaというWebサーバーで動いているので下記の方法でもWebサーバーの終了が可能
・`$ ps aux | grep puma`：psコマンドでプロセス番号を調べる
・'$ kill -9 プロセス番号'：プロセス終了

## #04 ディレクトリ構成を確認していこう
＜ディレクトリの構成＞
・`$ cd ..`：1つ上のディレクトリへ移動

・最初に主に扱うのは以下3つ
　・app：メインで使用
　・config：設定をする
　・db：データベースを扱う

＜appディレクトリの中身＞
・RailsではMVCモデルを採用
　・models：データ
　・views：画面
　・controllers：modelとviewを繋ぐ処理

## #05 モデルを作ってみよう
＜モデルの作成（ブログアプリ）＞
・`$ rails g model Post title:string body:text`：モデルの作成
　・データ型 → string：1行テキスト、text：複数行のテキスト
　・モデルについて、個々のデータの構造を定義するため単数形で記述することに注意
・`$ rails db:migrate`：データベースに反映

＜コマンドからのデータの格納＞
・`$ rails console`：様々な命令が実行できる


```ruby:方法①：Post.new
p = Post.new(title: 'title 1', body: 'body 1')
p.save
```

```ruby:方法②：Post.create
Post.create(title: 'title 2', body: 'body 2')
```

・Railsでは自動的にcreated_at、updated_atというフィールドが設定される
・SQLを意識しなくてもデータを直感的に扱えるアクティブレコードという仕組みを利用
・`quit`でコンソールを終了

##  #06 初期データを流し込んでみよう
＜データベースを直接確認する方法＞
・`$ rails dbconsole`または`$ rails db`：設計したDBに接続
・`.tables` → モデルはPostと単数形だが、テーブル名はpostsと複数形になることに注意
・`select * from posts;`にて中身を確認
・`.quit`で終了

＜ファイルで初期データを管理したい場合（コンソールを使わない方法）＞
(手順１)：dbディレクトリ中のseeds.rbというファイルを作成する
・Rubyを直接記述可能 → ループを使って記述できる

```ruby:seeds.rb
5.times do |i|
  Post.create(title: "title #{i}", body: "#{i}")
end
```

(手順２)：現在のテーブルの中身を一旦クリアする
・`$ rails db:migrate:reset`：テーブルを削除してまた新たに作成

(手順３)：手順１で書いた内容を流し込む
・`$ rails db:seed`
・`$ rails db` → `select * from posts;`にて中身を確認

## #07 コントローラーを作ってみよう
＜コントローラの作成＞
・`$ rails g controller Posts`
　・コントローラでは複数のデータを扱うため複数形になることに注意
・app/controllersディレクトリに「posts_controller.rb」、app/viewsディレクトリに「posts」などが作成される

＜ルーティングの設定＞
・どのURLにアクセスされた時にコントローラのどのアクションを実行するかを決める
・config/routes.rb に書いていく
　・一般的な処理を一気に設定したい場合、`resource :posts`と追記する

＜設定されたルーティングの確認方法＞
・`$ rails routes`

```:>_ターミナル
# ルーティングの意味について
# /posts に GET でアクセスして来たら postsコントローラのindexアクションを実行
posts GET    /posts(.:format)    posts#index
```

＜記事一覧を表示するためのアクションの追加＞
・app/controllers/posts_controller.rb 中にメソッドを記述

```ruby:posts_controller.rb
class PostsController < ApplicationController

  def index
    # Post.all：全データを取得
    # .order(created_at: 'desc')：降順に並び替え（昇順はasc）
    @posts = Post.all.order(created_at: 'desc')
  end
	
end
```

## #08 記事の一覧を表示してみよう
＜ビューファイルの作成＞
・Postsコントローラのindexアクションに対応するビューはapp/views/posts中に「index.erb」という名前でファイルを作成すればよい
・ctrl + f で新規ファイルの作成可能

＜ビューファイルの編集＞
・HTMLを記述
・.erb中でRubyの命令を埋め込むには<% %>や<%= %>の中に記述
・<% %>：ブラウザには非表示
・<%= %>:ブラウザに表示

```index.html.erb
<h2>My Posts</h2>
<ul>
<% @posts.each do |post| %>
<li><%= post.title %></li>
<% end %>
</ul>
```

＜Webサーバーで確認＞
・`$ rails s`
・ブラウザで`http://IPアドレス:3000/posts`を表示
・記事が一覧表示されていたら成功

##  #09 rootパスを設定してみよう
・rootパス（`http://192.168.33.10:3000`）で記事一覧ページが表示されるようにしたい

＜ルーティングの設定＞

```ruby:routes.rb
Rails.application.routes.draw do
  resource :posts
  root 'posts#index'
end
```

・`$ rails routes`でルートを確認

```:>_ターミナル
$ rails routes
  #rootパスに対するルーティング
  root GET    /    posts#index
```

・ブラウザで確認 → rootパスで記事一覧が表示される

＜Convention over Configuration（CoC）＞
・Railsでは単語が単数形 or 複数形、どこにどのファイルを作るか、など細かいルールが設定されている
・設定より規約
・規約を決めてあげることでコード記述量を減らすことを狙いとしている

## #10 画面をカスタマイズしてみよう
・app/views/layoutsフォルダのapplication.html.erbファイルにアプリ全体のレイアウトがある
・ビューで書いたコードは<%= yield %>の部分で読み込まれるという仕組み

・HTML/CSSで見た目を整える
・app/assets/stylesheetsフォルダ中のapplication.cssファイルで全体のCSSを設定

##  #11 link_toヘルパーを使ってみよう
＜リンクを貼る＞
・link_toヘルパー：`<%= link_to 表示する文字, URL %>`
　・表示する文字(第一引数) → (例)post.title
　・URL(第二引数) → (例)post_path(post.id)またはpost_path(post)
・HTMLにおける`<a href="URL">タイトル</a>`と同様の意味
・ブラウザ更新するとリンクが付いたことが確認される

　・ちなみに、Progateでは`<%= link_to("第一引数", "第二引数") %>`となっていた
　・また、第二引数のURLは`"/posts/:id"`のように記述していた

```index.html.erb
<h2>My Posts</h2>
<ul>
<% @posts.each do |post| %>
<li>
<%= link_to post.title, post_path(post) %>
</li>
<% end %>
</ul>
```

＜showアクションの作成＞
・posts_controller中にshowアクションを作成する
　・`Post.find`：条件に合致するデータを取得
　・`params[:id]`：URLで渡ってくるidを取得

```ruby:posts_controller.rb
def show
  @post.find(params[:id])
end
```

## #12 記事の詳細を表示してみよう
＜showアクションのビューを作成＞
・app/views/postsフォルダ中にshow.html.erbファイルを作成
・ブログのタイトルと本文が見れる記事詳細ページのHTMLを記述していく

```show.html.erb
<h2><%= @post.title %></h2>
<p><%= @post.body %></p>
```

## #13 画像にリンクを貼ってみよう
・app/assets/imagesの中にロゴ画像を入れる
・共通レイアウトなのでapplication.html.erbファイル中に記述していく
・Rubyによる画像埋め込み → image_tagヘルパー：`<%= image_tag '画像の保存先' %>`
　・class属性を付ける場合は`<%= image_tag 'URL', class: 'クラス名' %>`とする
・画像にリンクを貼る場合、link_toヘルパーを併用する
　・`<%= link_to image_tag('画像の保存先', class: 'クラス名'), 'URL' %>`
　・どの値がどのヘルパーのオプションか分かりにくいためimage_tagの値は()で囲っておくと良い

## #14 記事を追加できるようにしよう
＜新規作成フォームの作成＞
・必要なもの
　①フォームが送信される先
　　・get "/posts/new" => "posts#new"
　　・post "/posts/" => "posts#create"
　②新規作成フォームにアクセスするためのリンク
　③newアクションとcreateアクション
　④新規作成フォームのHTMLファイル（new.html.erb）

## #15 新規作成フォームを作ろう
＜新規作成フォームに必要なもの＞
①新規作成フォームのHTML

②フォームに入力されたデータを送信する機能
　・フォームヘルパー（form_with、form_for）
　　・`<%= form_for :モデル名, url: 送信先のURL do |f| %>`
　　・|f| → フォームを作るためのオブジェクトがfで用意される
　　・ちなみに、Progateでは、`<%= form_tag(送信先のURL) do %>`としていた

③タイトル、本文を入力してもらうための欄と送信ボタン
・1行テキスト：text_field
・複数行テキスト：text_area
・送信ボタン：submit
・適宜CSSにて見た目を整える

```new.html.erb
<h2>Add New Post</h2>
<%= form_for :post, url: posts_path do |f| %>
<p>
  <%= f.text_field :title, placeholder: 'enter title' %>
</p>
<p>
  <%= f.text_area :body, placeholder: 'enter body text' %>
</p>
<p>
  <%= f.submit  %>
</p>
<% end %>
```

## #16 Strong Parametersを設定しよう
＜送信されてきたデータを簡単に確認する方法＞
・createアクションの中にデータを確認するアクションを記述する
　・`render plain: params[:post].inspect`
・ブラウザにて何か入力、送信してみると送信されてきたデータが何か確認可能

```ruby:posts_controller.rb
def create
  # 「render plain: データ」：そのままデータを出力
  #  「params[:post]」：送信されてきたデータ
  #  「.inspect」：データの中身を見る
  render plain: params[:post].inspect
end
```

＜送信されてきたデータの保存・記事一覧ページへの遷移＞
・createアクションでやるべきこと
　①データを受け取る：`@post = Post.new(params.require(:post).permit(:title, :body))`
　②保存：`@post.save`
　③記事一覧ページへリダイレクト：`redirect_to posts_path`

・①において`@post = Post.new(params[:post])`では以下のようなエラーが出ることに注意
　・悪意のあるデータが挿入されることを防ぐためにきちんとデータの形式を検証しましょうという内容
　・パラメータを強めにチェックしましょうという意味で「Strong Parameter」と呼ばれる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/307533/29170413-9e14-e82d-a50e-5e5eda458b6a.png)

・受け取ったパラメータを以下のようにチェックする必要がある
　・`@post = Post.new(params.require(:post).permit(:title, :body))`
　　・送信されてきたデータはpostをキーとしてtitleとbodyがあるハッシュじゃないとNGという意味
　　・Post.newの()内はよくprivateメソッドでまとめられる

```ruby:posts_controller.rb
def create
  @post = Post.new(post_params)  # post_paramsは、下記privateメソッドにあるpost_paramsメソッドを指す
  @post.save
  redirect_to posts_path
end
	
private
  def post_params
  params.require(:post).permit(:title, :body)
  end
```

## #17 バリデーションを設定しよう
・バリデーション：無効なデータをエラーにする

（手順１）
・app/modelsフォルダ中のpost.rbファイル中に記述
　・空欄NG：presenceを使用する
　・文字数制限：lengthを使用する
　・自作のエラーメッセージを表示（Railsが自動で入れてくれるので任意）

```ruby:post.rb
class Post < ApplicationRecord
  validates :title, presence: true, length: {minimum: 3, message: 'Too short to post!'}
  validates :body, presence: true
end
```

（手順２）
・コントローラにバリデーションに失敗した時の処理を追加する
　・問題なく保存できた場合は記事一覧ページへリダイレクトするように設定
　・保存できなかった場合はエラーメッセージを表示する
　　（今回は`render plain: @post.errors.inspect`を使用して確認）

```ruby:posts_controller.rb
def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to root_path
  else
    render plain: @post.errors.inspect
  end
end
```

## #18 エラーメッセージを表示しよう 
＜エラーメッセージの表示＞
(手順１)
・エラーがあった場合、`render 'new'`でnew.html.erbへ遷移

```ruby:posts_controller.rb
def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to root_path
  else
    render 'new'
  end
end
```

(手順２)
・エラーがあった場合、new.html.erbにてエラーメッセージが出るようにする
　・`<% if @post.errors.messages[:カラム名].any? %>`
　・`<span class="error"><%= @post.errors.messages[:title][0] %></span>`
　　・[0]を付けているのは1つ目のメッセージを表示させるため

```new.html.erb
<h2>Add New Post</h2>
<%= form_for :post, url: posts_path do |f| %>
<p>
  <%= f.text_field :title, placeholder: 'enter title' %>
  <% if @post.errors.messages[:title].any? %>
  <span class="error"><%= @post.errors.messages[:title][0] %></span>
  <% end %>
</p>
<p>
  <%= f.text_area :body, placeholder: 'enter body text' %>
  <% if @post.errors.messages[:body].any? %>
  <span class="error"><%= @post.errors.messages[:body][0] %></span>
  <% end %>
</p>
<p>
  <%= f.submit  %>
</p>
<% end %>
```
・HTML記述後、適宜CSSにて見た目を整える

（手順３）
・new.html.erb内で@postを使用したため、posts_controller.rbのnewアクションで空のオブジェクト@postを定義する

```ruby:posts_controller.rb
def new
  @post = Post.new
end
```

## #19 編集フォームを作ろう 
・編集フォームの作成時にやること
　①edit, updateに関するルーティングの確認
　②記事一覧ページに編集ページへのリンクを作る
　③edit.html.erbのビュー作成（new.html.erbと内容は殆ど同じ）
　④edit, updateアクションを作成

(疑問点)
2:15～ :postを@postに変える理由は？

##  #20 記事を更新してみよう 
＜updateアクションの記述＞
①@postを取得
②バリデーションをかける（Strong Parameterを使用、Privateメソッド）
③エラーがあった時に編集ページに戻るようにrenderする

```ruby:posts_controller.rb
def update
  @post = Post.find(params[:id])
  if @post.update(post_params)
    redirect_to root_path
  else
    render 'edit'
  end
end
	
private
  def post_params
    params.require(:post).permit(:title, :body)
  end
```

・なお、記事詳細ページで改行が反映されるように設定するには`simple_format`を使用すればよい

```show.html.erb
<h2><%= @post.title %></h2>
# simple_format とすることで改行が反映されるようになる
<p><%= simple_format @post.body %></p>
```

## #21 Partialで共通部品を作ろう
・new.html.erbとedit.htm.erbは殆ど同じ
　→ Partialという仕組みを利用するとスッキリする

・Partial：共通のコードをまとめて記述可能

（手順１）Partialのファイルを作成
・_form.html.erb のようにアンダーバーから始める

（手順２）_form.html.erbファイルに共通部分をコピペ
・routes.rb 中でresourcesを使用している場合、そのオブジェクトを使うだけでRailsがパラメータをいい感じに解釈して設定してくれる

（手順３）new.html.erbとedit.htm.erbでPartialを読み込む
・各ファイルに`<%= render 'form' %>`と記述すれば良い
・_formとアンダーバーを付けないように注意

## #22 記事を削除できるようにしよう
＜記事の削除機能の追加＞
・やること
　①delete, destroyに関するルーティングの確認
　②対象のHTML中にdeleteボタンを付ける
　③destroyアクションの作成

①delete, destroyに関するルーティングの確認
・ターミナル中に下記のような削除に関するルーティングがあるか確認

```:>_ターミナル
DELETE   /posts/:id   posts#destroy
```

②対象のHTML中にdeleteボタンを付ける
・deleteであることを明示するために`method: :delete`と記述
・改行入れてもOK
・削除時に確認ダイアログが出た方が良いので、`data: {confirm: 'Sure?'}`などを記述してあげるとなお良し

```index.html.erb
<%= link_to '[×]',
    "post_path(post),
     method: :delete,
     class: "command", 
     data: {confirm: 'Sure?'} %>
```

③destroyアクションの作成
・削除対象のidを取得
・`@post.destroy`にて削除
・記事一覧ページへリダイレクト

```ruby:posts_controller.rb
def destroy
  @post = Post.find(params[:id])
  @post.destroy
  redirect_to root_path
end
```

## #23 コメントモデルを作っていこう 
＜記事にコメントを付ける＞
・やること
　①Commentモデルを作成する
　②Commentモデルの確認、バリデーションの設定
　③PostモデルにもCommentモデルと紐づいていることを記述
　④ルーティングの設定
　⑤Commentモデルに関するコントローラを作成

①Commentモデルを作成する
　・モデル名はComment
　・bodyのデータ型はstring
　・postと紐付けたいので`post:references`とする

```:>_ターミナル
$ rails g model Comment body:string post:references
```

②Commentモデルの確認、バリデーションの設定
・app/modelsフォルダ中にcomment.rbが作成されているか確認
・comment.rbファイルの中を見て、`belongs_to :post`と記述があればPostモデルに紐づけられているか確認
・バリデーションの設定 → bodyの空欄NGとする

```comment.rb
class Comment < ApplicationRecord
  belongs_to :post
  validates :body, presence: true
end
```

③PostモデルにもCommentモデルと紐づいていることを記述
・コメントは複数あってもよいので`has_many :comments`とする

```ruby:post.rb
class Post < ApplicationRecord
  has_many :comments
  validates :title, presence: true, length: {minimum: 3, message: 'Too short to post!'}
  validates :body, presence: true
end
```

④ルーティングの設定
・以下のように記事に紐づいた形で設定していく

```ruby:route.rb
resources :posts do
  resources :comments
end
```

・`$ rails routes`で記事とコメントが紐づいたルーティングができているか確認

```:>_ターミナル
$ rails routes
・・・
     post_comments GET    /posts/:post_id/comments(.:format)
                                   comments#index
                   POST   /posts/:post_id/comments(.:format)
                                   comments#create
  new_post_comment GET    /posts/:post_id/comments/new(.:format)
                                   comments#new
 edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format)
                                   comments#edit
      post_comment GET    /posts/:post_id/comments/:id(.:format)
                                   comments#show
                   PATCH  /posts/:post_id/comments/:id(.:format)
                                   comments#update
                   PUT    /posts/:post_id/comments/:id(.:format)
                                   comments#update
                   DELETE /posts/:post_id/comments/:id(.:format)
                                   comments#destroy
・・・
```

⑤Commentモデルに関するコントローラを作成
・`$ rails g controller Comments`
・続きは次回

## #24 コメント追加フォームを作ろう
＜コメントフォームの作成＞
・記事詳細画面（show.html.erb）にコメントフォームを追加する
・form_forに渡すパラメータについて、ルーティングを見ると以下のように「①postのid」と「②commentsの新しいオブジェクト(new)」が必要なのが分かる

```:>_ターミナル
・・・
new_post_comment GET    /posts/:post_id/comments/new(.:format)
                                 comments#new
・・・
```

・postに紐づいた形でのコメントの新しいオブジェクトを作るには`@post.comments.build`とする
・form_forで複数のパラメータを渡す際、配列[]にして()で囲うことに注意

```show.html.erb
<h2><%= @post.title %></h2>
<p><%= simple_format @post.body %></p>

<!-- 以下のコメントフォームを追加 -->
<h3>Comments</h3>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <p>
    <%= f.text_field :body %>
  </p>
  <p>
    <%= f.submit  %>
  </p>
  <% end %>
```

## #25 コメントを保存しよう 
＜コメントフォームの送信先のアクションを作成＞
・comments_controller.rbにcreateアクションを作成したい

・createアクションの中身に何を記述していくか
　→ 以下のルーティングを見ると、comments#createには:post_id情報が渡ってくる
　→ params[:post_id]を用いて個別の記事を取得する

```:>_ターミナル
・・・
 POST   /posts/:post_id/comments(.:format)
                 comments#create
・・・
```

・createアクションの中身を記述していく
　①post_idを受け取る
　②コメントを保存
　③記事一覧画面に返す
　④privateメソッドを使ってStrong Parameterを設定

```ruby:comments_controller.rb
class CommentsController < ApplicationController

  def create
    @post = Post.find(params[:post_id])
    @post.comments.create(comment_params)
    # @post = Post.new(post_params) + @post.save としてもよい
    redirect_to post_path(@post)
  end
  
  private
    def comment_params
      params.require(:comment).permit(:body)
    end

end
```

## #26 コメントの一覧を表示しよう 
・記事詳細ページにコメントが表示されるようにしたい
・app/views/postsフォルダ中のshow.html.erbファイルに記述していく
　→ if文、eachメソッドを使用

```show.html.erb
<h2><%= @post.title %></h2>
<p><%= simple_format @post.body %></p>

<h3>Comments</h3>

<!-- 以下～form_forの手前まで追加 -->
<% if @post.comments.any? %>
<ul>
  <% @post.comments.each do |comment| %>
  <li>
    <%= comment.body %>
  </li>
  <% end %>
</ul>
<% end %>

<%= form_for([@post, @post.comments.build]) do |f| %>
  <p>
    <%= f.text_field :body %>
  </p>
  <p>
    <%= f.submit  %>
  </p>
  <% end %>
```
## #27 コメントを削除できるようにしよう 
・コメントの削除
・index.html.erb中に削除機能を付けた時と同様のことを行う
・やること
　①delete, destroyに関するルーティングの確認
　②対象のHTML中にdeleteボタンを付ける
　③destroyアクションの作成

①delete, destroyに関するルーティングの確認
・以下よりpathはpost_comment、渡すべきものはpost_idとコメントのidであることが分かる

```:>_ターミナル
 DELETE /posts/:post_id/comments/:id(.:format)
                 comments#destroy
```

②対象のHTML中にdeleteボタンを付ける

```show.html.erb
<h2><%= @post.title %></h2>
<p><%= simple_format @post.body %></p>

<h3>Comments</h3>
<% if @post.comments.any? %>
<ul>
  <% @post.comments.each do |comment| %>
  <li>
    <%= comment.body %>
    <!-- 以下～</li>の手前まで追加 -->
    <%= link_to '[×]',
          post_comment_path(@post, comment),
          method: "delete",
          class: "command", 
          data: {confirm: 'Sure?'} %>
  </li>
  <% end %>
</ul>
<% end %>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <p>
    <%= f.text_field :body %>
  </p>
  <p>
    <%= f.submit  %>
  </p>
  <% end %>
```

③destroyアクションの作成

```ruby:comments_controller.rb
def destroy
  @post = Post.find(params[:post_id])
  @comment = @post.comments.find(params[:id])
  @comment.destroy
  redirect_to post_path(@post)
end
```

## #28 アプリを完成させていこう
・記事を削除した時に、その記事に付いたコメントも削除したい

・Postモデル（post.rb）の中で`dependent: :destroy`を記述すると、ある投稿を削除した時に関連するモデルからデータを削除するようになる

```ruby:post.rb
class Post < ApplicationRecord
  has_many :comments, dependent: :destroy
  validates :title, presence: true, length: {minimum: 3, message: 'Too short to post!'}
  validates :body, presence: true
end
```

＜確認方法＞
・`$ rails db` → `select * from comments where post_id = 12;`
・削除後はデータベースの中も空になっていれば成功

```:>_ターミナル（記事削除前）
$ rails db
SQLite version 3.25.2 2018-09-25 19:08:10
Enter ".help" for usage hints.
sqlite> select * from comments where post_id = 7;
3|test|7|2018-11-13 11:57:48.684690|2018-11-13 11:57:48.684690
4|てすと|7|2018-11-13 11:57:55.006354|2018-11-13 11:57:55.006354
5|テスト|7|2018-11-13 11:58:05.307299|2018-11-13 11:58:05.307299
6|testてすとテスト|7|2018-11-13 11:58:09.580831|2018-11-13 11:58:09.580831
sqlite>
```

```:>_ターミナル（記事削除後）
・・・
sqlite> select * from comments where post_id = 7;
sqlite>
```

# まとめ、所感
- ドットインストールRuby on Rails 5入門編を実施し各章の内容を備忘録として記録した。
- 以前Progateで学んだ基礎の復習ができただけでなく、Progateには登場して来なかった記述法もあり、新たな知識を習得することができた。
- Ruby on Railsチュートリアルにチャレンジしたい。