post = Post.find_by(id:1)
post.content = “Rails”
post.save
投稿を削除する
destroy
次は、削除の流れを「rails console」で確認してみましょう。
投稿を削除するには、削除したい投稿を取得し、その投稿に対してdestroyメソッドを用いることで、データベースから削除することができます。
post.destroy
# editアクションへのルーティングを追加してください
get “posts/:id/edit” => “posts#edit”
def edit
end
フォームに初期値を用意する
textarea初期値
def edit
# 変数@postを定義してください
@post = Post.find_by(id: params[:id])
end
updateアクションを用意しよう
updateアクションはフォームの値を受け取るので、ルーティングを
getではなく、postにする必要があります。
また、特定のidの投稿を更新するので、URLにidを含むようにしましょう。
投稿を編集した後は投稿一覧ページにリダイレクトさせるので、ビューは
不要です。
フォームの送信先を指定しよう
form_tag
フォームで入力した内容をデータベースに保存するためには、フォームのデータをupdateアクションに送信する必要があります。
新規投稿ページを作ったときと同様に、form_tagメソッドを用いて、送信先を指定しましょう。
post “posts/:id/update” => “posts#update”
def update
redirect_to(“/posts/index”)
end
<%= form_tag("/posts/#{@post.id}/update") do %>
<% end %>
投稿を更新しよう
まずは更新する投稿データをデータベースから取り出します。
updateアクションのURLにはidが含まれているので、
そのidを用いてデータベースから投稿データを取得しましょう。
次に、
updateアクションでは、フォームから送信された値をparams[:content]で
受け取り、@post.content = params[:content]で投稿データの内容を更新します。
@post = Post.find_by(id: params[:id])
@post.content = params[:content]
@post.save
redirect_to(“/posts/index”)
end
削除機能をつくろう
destroyアクションのルーティング
destroyアクションのルーティングは以下のように、getではなくpostにします。destroyアクションでも、URLのidから削除したい投稿を特定できるように、「posts/:id/destroy」とURLの中にidを含むことに注意しましょう。
getとpost
フォームの内容を受け取るアクションは、受け取った値を使ってデータベースを変更していたから post だったのじゃ。
# destroyアクションへのルーティングを追加してください
post “posts/:id/destroy” => “posts#destroy”
# destroyアクションを作成してください
def destroy
redirect_to(“/posts/index”)
end
destroyアクションへのリンク
link_to(“削除”, “/posts/#{@post.id}/destroy”)
のように書けばいいんですね?
実はそのように書くと
「get “posts/:id/destroy”」のように書かれたルーティングを探してしまうのじゃ。
ここでは post 用の link_to の書き方を見ていこう。
post用のリンクを作ろう
link_tomethod
以下の図のようにlink_toの第三引数に「{method: “post”}」を追加することで、「post」として定義されているルーティングにマッチするようになります。
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>
削除機能を作ろうdestroy
削除機能を完成させるぞ。
データベースから投稿データを取り出して削除するんじゃったな。
どんなメソッドを使えばよいか覚えておるか?
えっと、 find_byでデータを取り出して、destroyで削除するんですよね?
その通りじゃ!それではやっていこう!
def destroy
# destroyアクションの中身を作成してください
@post = Post.find_by(id: params[:id])
@post.destroy
redirect_to(“/posts/index”)
end