Ruby on Railsでブログ作成(9) - UIからデータベースへ保存する

プログラミング、サーバー、ネットワーク、IT用語、ハマったときのトラブルシューティングなど様々なIT関連の話題をひたすら書いていく技術ブログです。

2017年2月24日金曜日

Ruby on Railsでブログ作成(9) - UIからデータベースへ保存する


ここからはブラウザから情報を入力してデータベースとやり取りできるようにしましょう。


まずコントローラーでArticleモデルをインスタンス化(new)してビューに渡します。ビューにはtitleとdescriptionがあり、それぞれのテキストボックスに文字を入力してsubmitボタンを押します。そして前回確認したようにモデルに記述してあるvalidatesなどの制約をチェックして、問題なければデータベースにデータを書き込みにいきます。この一連の流れを作ってみましょう。

まず、サーバーを起動しましょう。cloud9を使用している方は上部の方にRun Projectというボタンがあると思います。アクセスすると以前作成した「ここはホーム画面です。」が表示されると思います。今回はdomain/articles/newというURLで先ほどの一連の流れを作りたいので、そのURLでアクセスするとRouting Errorになると思います。route.rbを修正しましょう。

resources :articles

とroute.rbに追加すると下記のようにindex, create, new, edit, show, update, destroyと7つのメソッドが有効になります。


ブラウザをリロードするとuninitialized constant ArticlesControllerと出てくる思います。これを解消するためにapp/controllersの直下にコントローラーを作成しましょう。ファイル名はarticles_controller.rbとなり、クラス名はArticlesControllerになります。そのクラスにnewアクション(メソッドのこと)を書いていきます。因みにコントローラーだけメソッドのことをアクションと呼びます。

class ArticlesController < ApplicationController def new end end ここでブラウザをリロードしてみましょう。Template is missingとなるはずです。app/viewsディレクトリ配下にarticlesディレクトリを作成して、new.html.erbというファイルを作成しましょう。new.html.erbに適当に文字を書いてブラウザで表示されるか確認してください。

ビューフォームヘルパー

Railsにはビューフォームヘルパーというhtmlを生成をアシストしてくれる機能があります。たくさんあるので少しずつ覚えていけばよいと思います。このシリーズでもヘルパーをなるべく使用して作っていきたいと思います。ヘルパーを詳しく確認したい方はこちら

new.html.erbに下記を追記してみましょう。

<%= form_for @article do |f| %>

<% end %>

ブラウザをリロードすると<%= form_for @article do |f| %>の部分でエラーが起こります。それは@articleがないからです。これはどこで定義するかというとビューに処理が渡ってくる前、つまりArticleControllerのnewメソッドです。newメソッドでデータベースの操作に必要なArticleモデルをインスタンス化して@articleのインスタンス変数(@がついている変数はインスタンス変数になります)に代入してみましょう。そしてブラウザでリロードするとエラーは消えるはずです。

では、ヘルパーの続きを書いていきます。



するとシンプルなフォームができあがると思います。


では、次に何か適当にタイトル(title)と説明(description)を入力してボタンを押してみましょう。するとUnknown actionとエラーが出てきて、The action 'create' could not be found for ArticlesControllerと書かれています。つまりcreateアクションがないよと言われています。

createは新規でデータをデータベースに挿入しようとするときに呼ばれるアクションです。では、コントローラーにcreateアクションを作成しましょう。



今度はTemplate is missingというエラーが出てくると思います。しかしこれは気にする必要はありません。なぜなら、createはデータベースに新規データを保存するためのアクションなので表示させる画面はトップページだったり、同じページに戻るかなどと、少なくともcreateのためのテンプレートにはいくことはないはずです。

では、フォームで入力したタイトルや説明はどのように渡ってくるのでしょうか?それはparamsとして渡ってきます。paramsの中身を確認するには幾つかありますが、

raise params.inspect
render plain: params.inspect

などとして表示できます。私は大体raise params.inspectを使用しています。フォームで入力したデータはparams[:article]の配下にあり、:articleがトップレベルキーとなっています。このパラメーターをモデルに渡せばよいのですが、そのままだと不正のデータや意図しないパラメータ名が渡ってくることがあります。それを防ぐことが大切です。前回紹介したvalidatesもデータを安全に扱うための工夫の一つです。

ここでは、パラメーター名に不正がないかチェックします。この記事の最終版はこちらになります。


privateの配下にアクション、メソッドを置くとprivateメソッドになります。つまり同じクラス内(この場合はArticlesController)からしかアクセスできません。そこに:articleをトップレベルキーとしたパラメーターには何が許されるかpermitで記述します。この場合はtitleとdescriptionなのでコロンを付けて指定します。その後は前回の記事のrails consoleと同じでsaveをすればデータベースに保存されます。最後はredirect_toでshowアクションに飛ばしたいのですが、それは長くなるのでまた次回にします。データベースに保存されているかどうかはrails consoleで確認してみてください。因みに前回titleは3文字から10文字以内、descriptionは10文字から300字とvalidatesで指定しているので、入力した文字列の長さに注意してください。

次回はshowアクションを実装していきます。

◯「Ruby on Railsでブログ作成」シリーズの記事一覧はこちら



最近の投稿