【Rails】editアクション・updateアクションの使い方
今回は投稿を編集する方法をご紹介いたします。
編集に使用するアクションは7つのうち、
editアクションとupdateアクションの2つです。
ではどんな作業か必要か考えてみましょう。
まずは編集画面へのルーティング。
そしてindexページに編集ボタンを追加、
editアクションをコントローラーに定義、
そして編集ページの作成(フォーム作成)。
次に更新を行うためのルーティング、
updateコントローラーを定義、
編集完了画面のビュー作成。
こんなもんでしょうか。
ルーティングに関してはもう大丈夫かと思うので説明を省きます。
ちなみに編集した情報を送信する際に使用するHTTPメソッドはPATCHです。
こちらは覚えておきましょう!
では、editアクションの定義からいきましょう。
編集→更新の流れは
新規投稿作成→投稿(保存)の流れととても似ています。
異なる点は、元々あるデータを紐付ける必要があるという点です。
編集前のデータを引継ぎ、そこから編集→更新を行います。
ではどのように紐づけるか、
削除機能の実装で学んだ( params[ : id ] )がまた活躍します
def edit
@post = Post . find ( params[ : id ] )
end
ここで注目すべきはインスタンス変数を用いてること!
なぜかお分かりでしょうか。
そもそもコントローラーでインスタンス変数を定義するのは
なんのためだったでしょうか。
ビューファイルに受け渡すためです。
どういうことかというと、idの情報を持った@postは
ビューファイルで記述することによって、
@post(編集前のデータ)の中身を表示させることができるのです。
便利ですね!!
ではビューファイルを作成しましょう。
今回は編集するためのフォームが必要です。
さらに、編集前のデータを含んだフォームが必要です。→@postを使いましょう。
form_withメソッドの便利な使い方を覚えてますか??
modelオプションを使ってパスを指定する方法です。
今回もこれを使っていきましょう。
<%= form_with ( model: @post , local: true ) do | form | %>
この@postには何が含まれてるか分かりますよね、
さっきコントローラーで定義した
@post = Post . find ( params[ : id ] ) 、
つまり編集前の情報です。
実はnewアクションで同じ見た目のインスタンス変数を定義しているの、
覚えてますか?
def new
@post = Post . new
end
ですね。
この二つの大きな違いは@postに中身が入った状態かどうか
ということです。
これはform_withメソッドが
インスタンス変数の中身次第で次の処理が
createアクションなのか、updateアクションなのか
振り分けてくれるんです。
中身が何もなければ保存、中身にすでにデータが入った状態であれば更新、
となります。頭いいですね!
これで編集画面はできました!
次に更新処理を実装します。(updateアクション)
こちらも元々のデータに上書きをするので、
テーブルと結びつける必要があります。
でももうやり方は大丈夫ですよね!
def update
post = Post . find( params[ : id ] )
post . update (post_params)
end
こうなります。
(post_params) は createアクションの時と同様で、
ストロングパラメーターを引数に持ってきているものです。
保存・更新をするときにはストロングパラメーターで、
取得するキーを指定しましょう。
あとは編集完了画面を編集して完了です!