blogで自分が投稿した記事に対して、読者がコメントをつける機能を実装してみましょう。 その為には現在のArticleモデルの他にもう1つモデルを追加する必要があります。
2つめのモデルをセカンドモデルと呼びます。 1つのblog記事に複数のコメントがついているような状態を1対多の関係と呼びます。
では実際に2つめのモデルを作成していきましょう。
今回は記事に対してコメントをつける為のモデルなので、Commentモデルを作成します。
モデルを作成するコマンドは教程1のコチラで解説したように$ rails g model名でしたね。
またモデルにどのようなデータが入るのかも後ろに続けることができます。
Articleモデルを作成した時は、
<strong>$ rails g model Article title:string text:text</strong>
というコマンドで、「stringという特徴をもったtitleという機能と、textという特徴をもったtextという機能のあるArticleという名前のモデルを作りなさい」という指示でした。
今から作成するコメントモデルにはstringという特徴を持ったcommenterという機能と、コメントを入力する為のtextという特徴をもったbodyという機能を追加します。
そこで
<strong> $ rails g model Comment commenter:string body:text</strong>
となります。
しかし、これでは新しくCommentモデルを作成することはできますが、ArticleモデルとCommentモデルはまだ独立したままです。
そこで、このArticleモデルとCommentモデルを関連づける必要があります。
こういった場合は、
<strong>$ rails g model Comment body:text article:references</strong>
となります。
最後のarticle:references ですが、referencesとは関連づけをする為のコマンドです。
article:referencesでarticleを参照しなさいという指示をCommentモデルに追加することができます。
これでArticleモデルの他に、Commentモデルというセカンドモデル(2つ目のモデル)を作ることができました。
しかし今のままではこの2つのモデルの関連づけはできていません。
そこで各モデルの関係性を明記してRailsにArticleモデルとCommentモデルは関連があるよ、と教えてあげなければいけません。
ArticleモデルとCommentモデルのファイルを開いてください。
Commentモデルファイルには既にbelongs_to articleと記述されています。
これはCommentモデルを作成する際に article:references とCommentモデルはarticleを参照しなさいというコマンドを追加していた為、RailsがCommentモデル作成時に自動で記述をしてくれいたからです。
しかし、このままではCommentモデルがArticleモデルに紐づいていることはわかりますが、ArticleモデルがCommentとどのような関係かがわかりません。
そこでArticleモデルに has_many :commtens と追記して保存します。
これでArticleモデルとCommentモデルの関連付けができました。
Commentモデルは完成しましたが、まだコメントをつけることができるようにはなっていません。
教程4でblogアプリを作成した際にRoutesファイルに resources :aritcleと追記することで、blogアプリはarticle(記事)を下に作成しますと宣言することになります と解説しました。
実はresources :aritcleと記述することで、articleを作成(create)したり、表示(show)したり、更新(edit/update)したり、削除(delete)したりする為のパスやURIパターンが作成されていたのです。
今回もCommentのデータに必要な機能を作成する為にresources :commentsの1文を追加します。
recources :article do
resources :comments
end
と入れ子状態で記述することで、Commentデータに関するURIパターンやパスを作成する際に、articleと紐づけたものを作成してくれるようになります。
いちど$ rake routesで確認してみましょう。
Commentに関するURIやパスがarticleと紐づいているのがわかります。
$ rake routesで確認する限りは、2つのモデルの関連付けはうまくいっているようです。
一度コンソールを使って、データがどのようになっているのかを見てみましょう。
article = Article.first
というコマンドで、articleという箱の中にArticleとして保存されたデータの中のfirst、つまり最初のデータを取得します。
article.commentsと入力すると、article = Article.firstで取得したarticleという箱に入ったデータに紐づいたコメントを確認することができます。
もちろん今はまだコメントを投稿していないので、コメント自体のデータは表示されません。
しかし、もし2つのモデルの関連付けがおこなわれていない状態でarticle.commentsコマンドを実行するとコンソールにはエラーが表示されます。
このコンソールの結果からも2つのモデルの関連づけはうまくっていることがわかります。
コンソールからコメントを作成しましょう。
教程4でコンソールからモデルにデータを保存する方法を解説しました。
教程4では article = Article.new(title: "別の書き方", text: "ありますよ") というコマンドでデータを作成する方法を紹介しました。
今回はこのコマンドを少し応用してコメントを作成します。
<strong>article.comments.create(body: "最初の投稿です")</strong>
これでデータベースにコメントのデータが保存されました。
ではもう一度article.commentsでコメントを見てみましょう。
Article.firstに紐づいたコメントのデータを確認することができました!
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。