Ruby on Rails: 編集機能の実装...chapter10
間違えてツイートしてしまったものを再編集できるように実装していきます。
----------------------------------やったこと------------------------------------------
①ルーティングの設定(edit)
②コントローラーの設定(edit)
③ビューの作成(仮)
④詳細ページから編集ページへのリンクを作成
⑤ルーティングの設定(update)
⑥コントローラーの設定(update)
⑦ビューの作成
⑧編集内容が再保存できるか確認
---------------------------------------------------------------------------------------
①ルーティングの設定(edit)
editで編集ビューを表示、updateで編集したものを保存するので最初にeditの方から設定を行います。
editはビューに編集ページを映すのが役割。
HTTP動詞は 'get'。
送るコントローラーはtweetsコントローラー。
その中で送るアクションはeditアクション。
pathはユーザーが欲しい情報のurlを書きます。
どのツイートを編集すればいいかがわかればいいから、取得したいツイートのidがわかればいいから'tweets/:id'。
このままではopenアクションとpathが同じなのでeditを付け、ルーターがどのパスに飛ばせば良いかを判断できるようにします。
②コントローラーの設定(edit)
tweets_controller.rb
editメソッドに処理内容を書いていきます。
Tweetモデルを使ってDBからツイート情報を獲得。
findメソッドを使ってどの数あるツイートから編集したいツイートを探す準備。
ツイートを探すためには保存されているツイートのidを取得すれば探しやすいのでparamsを使ってユーザーが欲しいツイート(id)を入れる箱を用意し、:(コロン)をつけidをkey(キー)にしてユーザー側が欲しいツイート(idの数字)をvalue(バリュー:値)として紐付けます。
見つけたツイートをビューに映したいのでインスタンス変数を使い代入します。
③ビューの作成(仮)
app/views/tweets/edit.html.erbを作成。
↓
作成したインスタンス変数@edit_tweetを使って取得したタイトルと本文を画面映すようにコードを書きます。
前に作成した一覧へ戻るため部分テンプレートを引用できるようにrenderメソッドを使って映せるようにします。
↓
$rails s
↓
http://localhost:3000/tweets/3/edit
④詳細ページから編集ページへのリンクを作成
app/views/tweets/open.html.erb
link_toを使って編集ページへのリンクを貼りました。
編集ページを映すだけなのでmethodはデフォルトのままなので記述する必要はないです。
⑤ルーティングの設定(update)
routes.rb
とりあえずHTTP動詞を指定。
patch...更新や変更、修正で使用。
put...更新よりは置換で使用。
よってpatchを定義。
↓
コントローラーの指定はtweetsコントローラー。
アクションはupdate。
↓
updateは画面に映すものではないのでcreateアクションに似ています。
しかし、createアクションと違って今回は既存しているツイートなのでidを指定する必要があるのでidをシンボル(:)としてキーにしてあげてツイートのid(数字)をバリューとして渡してあげられるようにします。
⑥コントローラーの設定(update)
app/controllers/tweets_controller.rb
ルーティングによってupdateに処理が渡されたのでupdateメソッドに処理内容を設定していきます。
↓
Tweetモデルを記述し、Tweetsテーブルに編集したツイートを渡せるようにします。
↓
どのツイートをなのかを探せるようにfindメソッドを記述。
↓
paramsを使ってidを受け取り、Tweetsテーブルに編集したツイートを保存できるようにします。
↓
変数update_tweetに代入。
↓
アップデートできるメソッドを検索。
参照:https://pikawaka.com/rails/update
updateメソッド...データに既存する情報を更新し保存できる。
↓
updateメソッドを使い、変更したいツイートを更新し保存できるようにします。
↓
保存する際に新規作成同様に要らない情報まで保存されないようにストロングパラメーターを使用。
⑦ビューの作成
app/views/tweets/edit.html.erb
↓
編集ページのイメージ図:
イメージができたのでコードを記述していきます。
↓
<%= form_with url: "/tweets/#{@edit_tweet.id}", model: @edit_tweet, method: :patch do |f| %> ~<% end %>
・form_with...で入力フォームを用意する。
・url: ...このフォームで入力した情報を渡す場所を書く。
・'/tweets/#{@edit_tweet.id}' ...今回渡したいurlはupdateのpath。つまりルーティングのupdateに書いたpath。
・model: ...渡したいモデルの場所を指定できる。@edit_tweetにはモデルの情報があるのでインスタンス変数を使用。
・method: ...デフォルトHTTP動詞はPOSTになっているので、methodでpatchと指定してあげることでpatchと認識してupdateアクションへ処理を渡せるようになる。
・|f|... フォームで書いたものを同じurlに送りたいので|と|で挟んで f をブロック変数として、これを送りたいメソッドの先頭に(f.○○○)書く。
<%= f.label :関連付けたいカラム名, '表示したい項目名' %>
f.label ...これを使うとフォームを押さなくても表示したい項目名をクリックするだけでフォーム入力できるようになる。
例) 新規登録フォーム →https://gyazo.com/05e7d98097105efe433f4a079a32e651
参照:https://qiita.com/tomoharutt/items/0f89abcd55bbbd1b9921
<%= f.text_field :title, value: @edit_tweet.title %>
<%= f.text_area :main, value: @edit_tweet.main %>
・text_field ...短い文(一行で済むもの)を入力したいところに使う。なのでタイトルに使用。
・text_area ...複数行入力させたいところに使う。よって本文へ使用。
・value ...ここに書くとすでに表示させたいものを入力フォームに表示しておくことができる。今回はすでに保存してあるツイートがどんなものだったのかを表示させたかったのでvalueを使用し表示させている。
<%= f.submit '〇〇' %>
・submit... ボタンを作成できる。
・'〇〇'...ここにボタンに表示したいボタン名を定義。今回は'再投稿'。
そして<% end %>でform_withが働く範囲を閉じる。
⑧編集内容が再保存できるか確認
$rails s
↓
編集ページへ行って。。。
↓
タイトルと本文を編集して再投稿して一覧へ戻ると。。。
↓
タイトルが変更されている。
↓
詳細ページも見てみる
大丈夫そう!
編集機能の実装終了!
これで基本の7つのアクションの学習は終了!
以上です。