データを登録できるようにした

はじめに

Railsのポートフォリオとして作成中のMoneyAppで、データを登録できるようにした。

新規投稿ページのルーティングを設定

まずは、config/routes.rbでルーティングの設定を行う。

5行目を追加した。

これで、/posts/new(ルートから見た時の相対パス)というURLにアクセスしたときに、postsコントローラのnewアクションが呼ばれる。

新規投稿ページのnewアクションを設定

現状は、以下のエラーが発生している。

app/controllers/posts_controller.rbの6~7行目にnewアクションを追加した。

新規投稿ページのviewファイルを作成

現状、以下のエラーが表示されている。

app/views/postsにnew.html.erbを新規追加する。

これでエラーが解消された。

共通レイアウトに新規投稿ページのリンクを設定

app/views/layouts/application.html.erbの26~28行目にlink_toメソッドを追記した。

ブラウザの表示はこちら。記録するをクリックすると、新規投稿ページに遷移する。

新規投稿ページに入力フォームを追加する

まずは支出を入力できるようにしていく。

app/views/posts/new.html.erbに以下を追記した。(参考 : <input>: 入力欄(フォーム入力)要素 – HTML: ハイパーテキストマークアップ言語 | MDN

HTMLは、画面の左上に重力がかかっているため、以下のようになる。ヘッダー要素の背後に隠れてしまって、フォームに値を入力することができない。

CSSでレイアウトを整える

CSSによって、フォームに値を入力できるようにしていこう。

要素の検証で、ブラウザを確認しながらCSSを調整した。

app/assets/stylesheets/posts.scssに調整後のCSSを追記した。

これで、入力フォームに値を入力することができるようになった。

ちなみに、app/assets/stylesheets/application.cssに以下の記述があるおかげで、app/assets/stylesheets/posts.scssが読み込まれる。おそらく、scssはrails内でCSSにコンパイルされる。

この記述を削除すると、以下のようにCSSが適用されなくなる。

<input type=”button”> – HTML: ハイパーテキストマークアップ言語 | MDNを参考に、ボタンも追加した。カーソルを当てた時に、指のアイコンになるようにした。

http://localhost:3000/posts/new
app/views/posts/new.html.erb
app/assets/stylesheets/posts.scss

【本題】データベースに情報を記録できるようにしていく

これまでは、新規投稿ページにアクセスして、入力フォームがレンダリングされるまでを構築していった。

これから、記録ボタンを押した時に、支出の「何に」という情報がデータベースに記録されるようにしていく。

まずはルーティング。/posts/createにアクセスした時に、postsコントローラのcreateアクションが呼び出されるようにした。

config/routes.rb

postsコントローラには、createアクションを追加した。

app/controllers/posts_controller.rb

ビューファイルには、form_tagを追加した。これで、フォームを送信した時に、createアクションが呼ばれるようになる。

app/views/posts/new.html.erb

creteアクションの処理を詳しく書いていく。

@postというインスタンス変数に、postsテーブルにnewメソッドを用いた結果を代入する。newメソッドの引数には、contentカラムにparam変数のnameをセットしている。その後、@postをsaveメソッドで保存した。最後に、redirect_toで、一覧ページにリダイレクトさせた。

app/controllers/posts_controller.rb

しかし、記録ボタンを押しても何も起こらなかった。

原因は、記録ボタンのtype属性が単なるbuttonだったから。

app/views/posts/new.html.erb

submitを使用する必要があった。

<input type=”submit”> – HTML: ハイパーテキストマークアップ言語 | MDN

submitに変更すると、なぜか記録ボタンの見た目が変わった。

http://localhost:3000/posts/new

記録ボタンを押すと、一覧画面に遷移して、データが登録できていることが確認できた。

http://localhost:3000/posts/index

処理の流れを追う

ローカルサーバーが残したログを参考にして、記録ボタンを押してから、データがデータベースに保存されて、一覧画面に表示されるまでの流れを追っていこう。

ボタンを押した直後の挙動

form_tagによって、指定されたURLのルーティングを探しに行き、POST(送信)であることを見つけたようだ。そして、Postsコントローラのcreateアクションを処理してくれた。パラメータのnameが無印と認識してくれている。

ログ
app/views/posts/new.html.erb
config/routes.rb

コントローラの処理

app/controllers/posts_controller.rb
ログ

ログが見にくいので拡大しよう。

  TRANSACTION (1.9ms)  BEGIN
  ↳ app/controllers/posts_controller.rb:11:in `create'
  Post Create (20.1ms)  INSERT INTO "posts" ("content", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["content", "無印"], ["created_at", "2024-08-24 03:54:53.534444"], ["updated_at", "2024-08-24 03:54:53.534444"]]
  ↳ app/controllers/posts_controller.rb:11:in `create'
  TRANSACTION (1.1ms)  COMMIT
  ↳ app/controllers/posts_controller.rb:11:in `create'

posts_controllerの11行目の処理をログに残してくれている。postsテーブルのcontentカラムに値を挿入している。

BIGIN、INSERT、COMMITの3つの処理が行われていることが分かる。

ログ

リダイレクトの処理

次に、postsコントローラの12行目に書いたように、一覧ページへのリダイレクトの処理が行われている。

app/controllers/posts_controller.rb
ログ

一覧ページの処理

最後に、リダイレクト先の一覧ページでの処理が行われる。

ログ

まずは、/post/indexのルーティングで、postsコントローラのindexアクションを確認している。

config/routes.rb

postsコントローラのindexアクションでは、@postsというインスタンス変数に、postsテーブルから全てのカラムを取得したものを代入している。

app/controllers/posts_controller.rb

ログだと、まずは、共通レイアウトのapp/views/layouts/application.html.erbが呼ばれている。

その後に、postsコントローラのindexアクションに対応するテンプレートファイルのapp/views/posts/index.html.erbが呼ばれている。

app/views/posts/index.html.erb

3行目の@postsを見て、postsコントローラのindexアクションを確認して、以下のSQL文を発行している。

each文で@postsから取り出した一つ一つのデータに対して、postという変数で処理を行っている。

5行目のpost.contentでは、postsテーブルのcontentカラムの値を出力している。

その結果、ブラウザに無印と表示されたという訳だ。

http://localhost:3000/posts/index

次回予告

現状、「お金を何に使ったか?」しか記録できない。

「いつ、何に、いくら使ったか?」を記録できるようにしていく。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

投稿ID : 24355