Ruby on Rails: ツイート新規作成画面の実装〜投稿されたツイートをDBに保存する...chapter3-3-2
▶︎newページ(ツイート新規作成)にタイトルと本文を書き込めるフォームを作成
-----------------------------今回やったこと------------------------------------------
①tweets_controllerのnewアクションにインスタンスをつくり、インスタンス変数へ代入する
②viewsのtweets/new.html.erbに投稿フォームをつくり、controllerで作ったインスタンスをインスタンス変数を使ってビューに渡す
③ルーティングとcreateアクションに処理を追加
④tweetsコントローラーのcreateメソッドに処理内容を追加
⑤DBに保存できるか確認してみる
---------------------------------------------------------------------------------------
♠️ 前回
ここまで作りました。
これでは投稿ができない。フォームを作らなくては!
と言うわけで作っていきます。
①tweets_controllerのnewアクションにインスタンスをつくり、インスタンス変数へ代入する。
これ何してるの???
これでやったらどうなるの???
@tweet = Tweet.newって何してるねん。わからん。
調べてみるか...🔍
# Tweet.new
Tweetクラス(Tweetモデルオブジェクト)のインスタンスを作成。
Tweetクラスって何や? ➡︎ イメージはゲームで言うとTweetシリーズというもの。
モデルオブジェクトって何や? ➡︎ プログラムと関連するデータをまとめたオブジェクトを一つのモデルとして把握する考え方。(つまりTweetに関するゲームをまとめたTweetシリーズ(Tweetモデル)ということかな🤔?)
インスタンスって何や? ➡︎Tweetシリーズのカセット1つ1つの内容。
という解釈しました。
作者がTweetシリーズ(設計図:Tweetクラス)を作ろうと考える。今回はTweetモデル
3つに分けて作ろう。じゃあ、内容はどうするか1つ1つ内容を考える(この1つ1つの内容を考えるってのがインスタンス)。
こんな感じでいいのかな🤔???
間違ってたらごめんなさい。
つまりTweet.newでTweetシリーズ(大まかな設計図)が出来て、ストーリー(内容)をつくる準備が出来ました。ってこと?今はそう解釈しておくことにします。
でもTweetシリーズのゲームを準備したけど、カセットの中身は空っぽ。何でかというとビューで内容を書いてもらいたいから(タイトルと本文)。
ではこの真っ新なカセットをビューに渡すぞ!!!
# @tweet
インスタンス変数という。
@を変数へつけることでビューへ渡せる。
②viewsのtweets/new.html.erbに投稿フォームをつくり、controllerで作ったインスタンスをインスタンス変数を使ってビューに渡す。
tweetsコントローラーから来たTweetシリーズのゲーム(内容はまだ書いていない)に内容をかけるように投稿フォームを作っていきます。
# form_with
form_forとform_tagの代わりになるもの。
viewで使うことで簡単にフォームを作れる。
入力した値を送る場所を簡単に指定できる。
コントローラーへデータを簡単に送れる。
# model: @tweet
これの使い方はモデルに入っているものが新しく作られたものか既存のものを呼び出したした場合で意味が変わるみたい。
今回はnewアクションに@tweetで空っぽのtweetシリーズのゲームカセットが届いて、そこにユーザーが入力して内容を書いてcreateアクションに渡してTweetモデルを使ってDBに保存する。って流れみたい。
なので、後でコントロールとルーティングに追加します。
参照:https://qiita.com/snskOgata/items/44d32a06045e6a52d11c
# |f|
||←これっていまいちわからなかった。
この||の中に入っている変数をブロック変数というらしい。
このブロック変数をform_with~endまでの間で使うと、情報を保持したまま使えるっぽい。
だから、f.〇〇って書くとゲームカセット内に情報が追加されていくって感じかな?
# f.label, f.text_filed, f.text_area + カラム名
先ほどのブロック変数でカラムを指定して@tweet内のどのカラムに情報を入れるかを示してるらしい。
# f.submit
そして、これらの入力した情報を保持したままtweetsコントローラー内のcreateアクションへ情報を送り、Tweetモデルを伝ってDBへ保存って流れっぽい。
③ルーティングとcreateアクションに処理を追加。
ルーティングにtweetsコントローラーのcreateアクションを使えるように追加する。
http://localhost:3000/tweets/newで確認してみる。
エラーが出た。。。何で??????わからん。
原因を調べてみると、newアクションでは投稿ページをget(HTTP動詞)を使って画面に出力したが、createはpostを使ってデータを保存するので、画面にcreateは画面に出ないってことになる。
今回のこのルーティングの書き方↓
☘ get, post...これはHTTP動詞でどの処理をするかを決めるもの。
☘ 'tweets/〇〇...この部分はURL。だからtweets/createとかいても画面に映すものはないので、エラーになってしまう。でもpostだけ指定してもどのコントローラーへ情報を渡せばいいかわからないので、tweetは書かなければならない。
そして、どのアクションに飛ばせばいいかも分からないので、to: 'tweets#create'を書く。
これでもう一度確認してみる。
エラーが解消され、画面に表示されたぞ(^^)!
でもまだ、コントローラーにcreateメソッドは作ってあるけど、処理内容は空っぽなのでDBに保存できません。
次で保存できるようにします。
④tweetsコントローラーのcreateメソッドに処理内容を追加。
どうすればtweetsテーブルにデータが保存できるのか?
モデルをまず指定する。
あとはどうすればいいのか。調べますw
参照:https://qiita.com/s56258/items/a75fdb4d22a0b7ff58ce
見つけた。けど、けど、けど、、、どんな処理なの?これ???
ごちゃごちゃ書いてあって知識ないマンにとっては理解が難しい。。。と思ったらもう一つ見つけた。
privateから下の書き方は同じ感じ。
createメソッド内の書き方がなんか違う。先に見つけたの方が多い。どう違うのこれ?何で下は一行しかかかれてないの?
-----------------------------------調べた結果-----------------------------------------
# post_paramsメソッド内
✍️params
これは前に書いた値を受け取るための箱みたいなもの。
✍️require(:モデル名)
requireでパラメーターの中にモデルに対応するキーがあるか確認して存在する場合はバリューを返す。
このキーとバリューを調べる方法はgemに 'pry-rails'を追加し、$bundle install後にコントローラーの調べたい場所にbinding.pryを書いて処理を途中で止めて確かめる。
✍️permit(:カラム名)
データで保存したくないものを保存されないように使われる。
参照:https://pikawaka.com/rails/permit
✍️private
private以降に書くと呼び出しを制限でき、クラス外から呼び出しできない。またこれ以降に書くと関数形式で呼び出しができる。
参照:https://26gram.com/private-protected-in-ruby
✍️create
createメソッド。△△.create(○○)と書くと、()内にあるカラムに情報があれば(入力されたものがあれば)DBにこれ一行で保存できる。
🖐createとsaveの違い
create...一行でインスタンス生成からDBに保存までできる。
save...インスタンス生成と保存は別でないとできない。
---------------------------------------------------------------------------------------
今回は下の方法で書いてみる。
⑤DBに保存できるか確認してみる。
投稿ボタンを押して、、、Sequel Proを再読み込みして保存できてるか確認。
やったぜ!出来てる!!!
やっと投稿機能が完成しましたっ٩( ᐛ )وイエイっ!!!
次回は今までツイートしたタイトルを一覧できるようにしていきたいと思います。
以上です。