\ プログラミング学習奮闘記録 /

Progate学習メモ Ruby on Rails5【〜投稿の編集・削除〜】

投稿データの編集や削除をするためにはデータベースを操作する必要がある

目次

rails consoleでコードを試す

投稿を編集する

投稿を編集するには、以下の3ステップが必要

①編集したい投稿を取得

②その投稿のcontentの値を上書き後

③データベースに保存

《ターミナル》

$ rails console

post = Post.find_by(id:1) ← ①編集したい投稿を取得

post.contents = “我が名はアシタカ” ← ②その投稿のcontentの値を上書き

post.save ← ③データベースに保存

  • post.content = “新しい値”とすることで、投稿のcontentの値を上書きできる

updated_at

投稿データを編集してデータベースに保存すると、updated_atカラムの値がデータを更新したときの時刻に更新される

投稿を削除する

削除は、以下の2ステップでできる
①削除したい投稿を取得

②その投稿に対してdestroyメソッドを用いて削除

《ターミナル》

$ rails console

post = Post.find_by(id:1) ← ①削除したい投稿を取得

post.destroy ← ②destroyメソッドを用いて削除

投稿編集ページを作成する

ルーティング、コントローラ、ビューを作成する

《ルーティング》

get “posts/:id/edit” => “posts#edit”

どの投稿の編集ページか判別するために、投稿編集ページのURLには編集したい投稿のidを入れる

→showアクションと同様にルーティングにidを含める

《posts_controller.rb》

def edit

def

《posts/edit.html.erb》

↑新規ファイルから作成する

編集ページへリンクを追加する

リンクに指定するidには、postsコントローラーのshowアクションで取得した投稿データのidを利用する

《posts/edit.html.erb》

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

《posts_controller.rb》

def show

@post = Post.find_by(params[:id])

end

入力フォームを用意する

新規投稿ページと同じように、ここでも<textarea>タグを使って入力フォームを用意する

フォームに初期値を用意する

<textarea>タグでは「<textarea>初期値</textarea>」のようにタグで囲んだ部分を初期値として設定できる。

《posts/edit.html.erb》

<textarea>アシタカ</textarea>

投稿内容を初期値にする

《ルーティング》

get “posts/:id/edit” => “posts#edit”

《posts_controller.rb》

def edit

@post = Post.find_by(id:params[:id])

↑editアクションでURLのidと同じidの投稿データをデータベースから取得

end

《posts/edit.html.erb》

<textarea><%= @post.content%></textarea>

↑そのcontentの値(=投稿の内容)を初期値に設定

編集内容を保存する

入力フォームができたので、次はその入力内容を受け取るためのupdateアクションを用意する

update アクションには以下の機能をつける。

・フォームの内容の保存

・投稿一覧画面への転送

updateアクションを用意する

《ルーティング》

       ↓特定のidの投稿を更新するので、URLにidを含む

post “posts/:id/update” => “posts#update”

↑updateアクションはフォームの値を受け取るので、ルーティングをgetではなく、postにする

《posts_controller.rb》

def update

redirect_to(“/posts/index”)

end

  • 投稿を編集した後は投稿一覧ページにリダイレクトさせるので、ビューは不要

フォームの送信先を指定する

フォームで入力した内容をデータベースに保存するためには、フォームのデータをupdateアクションに送信する必要がある

《posts/edit.html.erb》

<%= form_tag(“/posts/#{@post.id}/update”) do %>

<textarea><%= @post.content%></textarea>

<input type=”submit” value=”保存”>

<% end %>

  • 新規投稿ページを作ったときと同様に、form_tagメソッドを用いて、送信先を指定する

updateアクションの中身

投稿内容を更新する手順

①URLに含まれるidを用いて、データベースから投稿データを取得する

②フォームから編集内容を受け取り、データを更新する

《ルーティング》

post “posts/:id/update” => “posts#update”

《posts/edit.html.erb》

<%= form_tag(“/posts/#{@post.id}/update”) do %>

<textarea name=”content”><%= @post.content%></textarea>

<input type=”submit” value=”保存”>

<% end %>
《user_controller.erb》

def update

@post = Post.find_by(id: params[:id])

↑updateアクションのURLにはidが含まれているので、そのidを用いてデータベースから投稿データを取得

@post.content = params[:content] ← <textarea>フォームの値を受け取る

フォームから送信された値をparams[:content]で
受け取り、@post.content = params[:content]で投稿データの内容を更新

@post.save ←更新を保存

  1. 新する投稿データをデータベースから取り出す。
  2. <textarea>タグにname属性を指定し、フォームの入力内容が変数paramsに代入されてupdateアクションに送信されるようにする
  3. 更新を保存

削除機能を作る

投稿詳細ページの削除リンクをクリックすると投稿が削除されるようにする

destroy アクションを追加して投稿を削除できるようにする

destroy アクションには以下の機能をつける。

・投稿の削除

・投稿一覧画面への転送

destroyアクションのルーティング

《ルーティング》

post “posts/:id/destroy” => “posts#destroy”

  • getではなくpostにする
  • URLのidから削除したい投稿を特定できるように、URLの中にidを含める

destroyアクションへのリンク

link_toの第三引数に「{method: “post”}」を追加することで、「post」として定義されているルーティングにマッチするようになる。

《posts/show.html.erb》

<%= link_to(“削除”,”/posts/#{@post.id}/destroy”,{method: “post”})%>

削除機能を作る

find_byでデータを取得して、destroyで削除する

《posts_controller.rb》

@post = Post.find_by(id: params[:id])

@post.destroy

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次