![見出し画像](https://assets.st-note.com/production/uploads/images/118857125/rectangle_large_type_2_6729297acee14ade746f1f1dc92852e0.png?width=1200)
知識ゼロからの 『とほほのRuby on Rails入門』 #14
これはプログラミング初心者がRuby on Railsの勉強をしていく記録です。
◇ この記事で勉強しているサイト
◇ 前回までの記事一覧
「機能追加」という項目の続きから!
コメント機能を追加する
ブック管理アプリにコメント機能を追加するようです。
直接追記するわけではなく、Commentという新しいモデルやコントローラを作って紐づけるようです。
まずはブック管理アプリを作成した時と同様に、モデルの作成とマイグレーション、コントローラの作成をします。
Start Command Promptに以下のように入力します。
![](https://assets.st-note.com/img/1696909930544-p332hC2BCd.jpg?width=1200)
モデル名はComment、受け取るデータはcommenter(コメントした人)、body(コメント)、book(どの本に対してか)の3つのようです。
![](https://assets.st-note.com/img/1696909937733-VxIa4uH78z.jpg?width=1200)
![](https://assets.st-note.com/img/1696909944109-WnPt8n9sp3.jpg)
入力した後に下に出てくるやつ、今まで分からないから読んでいませんでしたが何を生成したか書いてくれていたんですね。
モデルの作成で入力した最後の部分の「references」はreferences型といって、新しく作成するカラムに作成済みのテーブルを指定する場合に使うそうです。
これを「親子関係をもつテーブル」というようです。
以前作ったExcelのイメージ図だとこんな感じですかね。
![](https://assets.st-note.com/img/1696896240718-QFzD8QU2TF.png?width=1200)
![](https://assets.st-note.com/img/1696896254819-UmyUi0UWmK.png?width=1200)
次は、modelsのbook.rbに以下のように追記します。
![](https://assets.st-note.com/img/1696911744775-wDY8tPpBSR.jpg)
このhas_many :commentsによって、Bookモデルの子供がCommentモデルであると示すことが出来るようです。
さらにroutes.rbにも追記。
![](https://assets.st-note.com/img/1696912298701-ddV5ZnnT3W.jpg)
これだけでいいみたいです。簡単ですね。
↑ 項目「2.7ネストしたリソース」に書いてあります。
次に、comments_controller.rbに追記します。
![](https://assets.st-note.com/img/1697198539066-M8zFGLMQfw.png)
![](https://assets.st-note.com/img/1697198573221-dATdLfogxo.png)
新規作成にかかわる処理ですね。
ブック管理アプリを作った時と比べるとわかりやすいかもしれません。
![](https://assets.st-note.com/img/1697200833133-OXLUDKKYb0.png?width=1200)
def createの部分は結構違いますね。
.newが無いのと、条件分岐もないですね。
@commentという新しいインスタンス変数を用意しています。
そしてこのcreateというメソッドの処理が終わったら、その本の詳細画面が表示されると。
Viewの記述も見た方が分かりやすそうなので出します。
booksのshow.html.erbに追記します。
![](https://assets.st-note.com/img/1697199199056-8IkW6h6iJB.jpg)
<strong>〜</strong>はHTMLで勉強しました!
重要性の高いテキストに利用するようです。
ここでは「コメントした人」を重要なテキストとしているみたいですね。
そしてその下にコメントの内容を表示。
その下からはコメント記入欄みたいです。
form_withの所はいったん置いておいて、その下はcommenterとbodyそれぞれの入力欄と送信ボタンですね。
text_fieldで生成される入力欄は一行分しか書けないので、bodyには複数行入力できるtext_areaを使っているようです。
form_withの所を詳しく見ていきます。
ちょっと複雑なので、Books編集画面の時と比べてみました。
![](https://assets.st-note.com/img/1697200510267-sacLPOwhOB.png?width=1200)
(パーシャル化する前のものと比べたかったのでこんな感じになっています)
今回はmodelを2つ指定していますね。
「どのbookにコメントするか」も必要だから、bookとcomments両方指定してあるんですかね。
「build」というのはnewメソッドの別名とのこと。
ただモデルの関連付けの際はnewではなくbuildを使う慣習があるようです。
他に参照した記事
ブック管理アプリの時はControllerにBook.newと記述していましたが、今回はControllerではなくViewでbuildが出てくるのは、Commentモデルが親ではなく子だからという事に関係しているんですかね。
この辺今は練習コードがあるけど、自分で書くとなると何を書いたらいいのかまだ全然理解が足りていないです。
ブラウザ画面を見にいってみます。
![](https://assets.st-note.com/img/1697241902808-OStCJ2geR6.png?width=1200)
![](https://assets.st-note.com/img/1697241936097-AkadMCvYWF.png?width=1200)
![](https://assets.st-note.com/img/1697241991737-tqjioRcEba.png?width=1200)
今回はこれで終わります。
いよいよ次回が最終回です。
感慨深いです。