このチャプターではモデルの作成について学びます。
ここまでで、index.html.erbというviewファイルを作成し、そのファイルにフォームを作成する為のコードを記述しました。これによって、ブラウザには記事を投稿するフォームを表示することができるようになりましたね。
そして、articlesコントローラにはnewとcreateという2つのアクションを追加しました。ブラウザのフォームを送信すると、フォームの中身がパラメータへ変換されcreateアクションに飛んでいることも確認ができました。
しかし、フォームを送信した後に表示される画面は現状では以下のようなエラー画面のままです。
createアクションに送信されたパラメータ(投稿内容)を保存して、必要なときに閲覧できるようにしたいですよね。ここで一度、ブログアプリ作成のチャプターで紹介した図を思い出してください。
実はデータベースへの保存や、保存されたパラメータの呼び出しなどデータに関連する処理を担っているのがmodelファイルです。
(Railsファイルの中でデータベースと唯一直接やり取りができる非常に重要な存在です。)その為、createアクションへパラメータを送信した後の処理にはmodelが必要になるのです。
コントローラを作成した時と同様にモデルもターミナルで作成します。
$ rails g model モデル名
でモデルは作成可能です。
今回はarticleに関するモデルの為、
$ rails g model Article
となります。
先ほどRailsファイルの中でデータベースと唯一直接やり取りができるのがモデルだと解説しました。
つまり、createアクションに送信されたパラメータはモデルであればデータベースへ保存したり、必要なときにデータベースから読み込むことができます。
しかし、Articleという名前だけではどのような種類のデータをデータベースとやりとりすればいいのかがわかりません。
そこでモデルを作成する際には、そのモデルにはどのようなデータが入るのかを指示する必要があります。
$ rails g model Article title:string text:text
title:stringとは「titleという名前のデータで、stringという形をしているよ」というデータに関する説明です。
$ rails g model Article title:string text:text
というコマンドは、「stringという形のtitleというデータと、textという形のtextというデータを含んだArticleというモデルを作りなさい」という意味です。
実際にターミナルでこのコマンドを実行してみましょう。
複数のファイルが作成されているのがわかります。
モデルにおいて重要なのはdb/migrate/20181116053450createarticles.rbと書かれたファイルが作成されていることです。
dbとはデータベースのことです。作成された20181116053450createarticles.rbはマイグレーションファイルと呼ばれるものです。
マイグレーションとはデータベーステーブルの作成や変更を簡単に行うためのしくみです。
しかしファイルが作成されただけではマイグレーションは実行されません。
$ rake db:migrate
というコマンドを実行すると20181116053450createarticles.rbファイルが実行され、Articleモデルのテーブルと属性が作成されます。
これでデータを保存する準備ができました。
失敗してやり直す場合
$ rake db:migrateでマイグレーションファイルを実行した後に、モデル名がArticleではなくAriticleと間違っていたことに気づいた場合はどうしたら良いのでしょうか。
コントローラなどであれば、コントローラファイルを削除して作りなおせばよいのですが、モデルファイルを作成し、マイグレーションファイルを実行していた場合は
マイグレーションファイルの取り消し(巻き戻し)→モデルファイルの取り消しを行います。
この順番が逆になるとうまくファイルの取り消しができないので注意しましょう。
$ rake db:rollback
でマイグレーションファイルを取り消し(巻き戻し)ます。
次に$ rails d model ArticleでArticleモデルを削除(Delete)します。
これでマイグレーションファイルとモデルが削除されました。
改めてモデルを作成しましょう。
このチャプターではモデルにデータを保存する方法を学びます。
Railsでは、コントローラとモデルを連携させてデータを保存します。
実際にコントローラやモデルでのデータ保存を実行する前に、モデルにデータを追加し、データベースへ保存する流れを理解しましょう。
コンソールを操作する
ブラウザを使わずにモデルを操作する為、フォーム画面も使えないということになります。
TitleやTextの入力~保存まですべてをターミナルで操作します。
$ rais cコマンドでCloud9のターミナルでコンソールが使用できるようになります。
コンソールが起動したら、まず
article = Article.new
と入力し、新しいモデルを作成します。
モデルとはデータのつまった箱のようなものと説明しましたが、このArticle.newで作成されたモデルにはまだ何のデータもはいっていません。
※nil とは何も値が入っていない(空っぽ)という意味です。
ではこの空っぽのArticle.newで作成したモデルに、属性(中身)を追加していきましょう。
追加する中身はtitle(タイトル)とtext(本文)です。
コンソールに続けて
article.title = テストタイトル
article.text = これはテストです
と入力してみましょう。
次にtitleとtextを追加したモデルをデータベースに保存します。
データベースへの保存は変数名.saveで実行されます。
今回であれば article.save となります。
artcile.saveを実行したときSQLというデータベースとやりとりをする言語が一生懸命処理をしてくれています。
【コンソールで確認できるSQLの処理】
以上が、コントローラやブラウザを使わずにモデルを作成し、データベースへ保存する方法です。
という流れです。
1と2の行程はまとめて実行することができます。
article = Article.new(title: "別の書き方", text: "ありますよ")
と1行にまとめて実行し、article.saveで保存します。
本教程では、まずblogアプリを作成し、トップページを指定する為にroutesファイルを書き換えました。
そして新しい記事の投稿画面としてviewファイルにフォームを作成し、ブラウザに表示することができました。ここでブラウザに表示されるのはviewファイルの中身であることも確認できましたね。
フォームの登録ボタンを押すと、フォームはデータ(パラメータ)として送信されることが確認できました。
そしてデータベースとのやりとりできるのはモデルであること、モデルの作成方法や、コンソールでの操作を確認しました。
次の教程からはコントローラとモデルを連携して、フォームのデータ(パラメータ)を保存する方法を解説します。
無料ビデオ講座のお知らせ
Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。