投稿データの編集や削除をするためにはデータベースを操作する必要がある
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 ←更新を保存
- 新する投稿データをデータベースから取り出す。
- <textarea>タグにname属性を指定し、フォームの入力内容が変数paramsに代入されてupdateアクションに送信されるようにする
- 更新を保存
削除機能を作る
投稿詳細ページの削除リンクをクリックすると投稿が削除されるようにする
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
コメント