2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

投稿の編集と削除機能(Ruby on Rails)

Posted at

#プログラミングの勉強日記
2020年7月15日 Progate Lv.196
Ruby on RailsⅣ

#投稿の編集
 投稿を編集するには、①編集したい投稿を取得、②その投稿のcontentの値を上書き、③データベースに保存する。post.content="新しい値"で投稿のcontentを上書きできる。

ターミナル
$ rails console
> post=Post.find_by(id:1)
> post.content="Rails"
> post.save

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

#投稿の削除
 投稿を削除するには、削除したい投稿を取得し、その投稿に対してdestroyメソッドを用いる。

ターミナル
$ rails console
> post=Post.find_by(id:2)
> post.destroy

#投稿編集ページ
 どの投稿の編集ページか判別するために投稿編集ページのURLには編集したい投稿のidを入れる。そのためshowアクションと同様にルーティングにidを含むようになる。

routes.rb
get "posts/:id/edit" => "posts#edit"
posts_controller.rb
def edit
end

posts/edit.html.erbを作成する。
投稿詳細ページから投稿編集ページにアクセスできるようにshow.html.erbに編集リンクを追加する。

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

#フォームの用意
 <textarea>初期値</textarea>のようにタグで囲んだ部分を初期値として設定。フォームの初期値として編集したい内容を表示する。editアクションでURLのidと同じidの投稿データをデータベースから取得し、そのcontentの値(=当行の内容)を初期値に設定する。

posts_controller.rb
def edit
  @post=Post.find_by(id: params[:id])
end
posts/edit.html.erb
<textarea> <%= @post.content %> <textarea>

#フォームの値の受け取り
 入力内容を受け取るためのupdateアクションを追加する。updateアクションはフォームの値を受け取るのでルーティングをpostにする。特定のidの投稿を更新するので、URLにidを含める。(投稿を編集した後は投稿一覧ページにリダイレクトされるのでビューは不要)

routes.rb
post "posts/:id/update" => "posts#update"
posts_controller.rb
def update
  redirect_to("/posts/index")
end

 フォームで入力した内容をデータベースに保存するためには、フォームのデータをupdateアクションに送信する必要がある。form_tagメソッド(簡単に入力フォームに必要なHTMLを作成する)を用いて、送信先を指定する。

posts/edit.html.erb
<%= form_tag("/posts/#{@post.id}/update") do %>
  <textarea> <%= @post.content %> </textarea>
  <input type="submit" value="保存">
<% end %>

##updateアクションの中身を作成
 1. URLに含まれたidを用いて、データベースから投稿データを取得する。

posts/edit.html.erb
<%= form_tag("/posts/#{@post.id}/update") do %>
routes.rb
post "posts/:id/update" => "posts#update"
posts_controller.rb
def update
  @post=Post.find_by(id: params[:id])

 2. フォームから編集内容を受け取り、投稿データを更新する。

posts/edit.html.erb
<textarea name="content" > ...</textarea>
posts.controller.rb
def update
  @post.content=params[:content]
  @post.save

#getとpostの使い分け
get:データベースを変更しないアクション
post:データベースを変更するアクション

#削除機能の作成
 destroyアクションのルーティングもpostにする。post用のリンクを作るためには、link_toの第三引数に{method: "post"}を追加する。

posts/show.html.erb
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"} ) %>
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?