【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アクションの時と同様で、

ストロングパラメーターを引数に持ってきているものです。

保存・更新をするときにはストロングパラメーターで、

取得するキーを指定しましょう。

 

あとは編集完了画面を編集して完了です!