Ruby on Rails5 学習コース IV

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

<%= link_to("編集", "/posts/#{@post.id}/edit") %>

フォームに初期値を用意する
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を用いてデータベースから投稿データを取得しましょう。

次に、

@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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする