#プログラミングの勉強日記
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を含むようになる。
get "posts/:id/edit" => "posts#edit"
def edit
end
posts/edit.html.erb
を作成する。
投稿詳細ページから投稿編集ページにアクセスできるようにshow.html.erb
に編集リンクを追加する。
<%= link_to("編集", "/posts/#{@post.id}/edit") %>
#フォームの用意
<textarea>初期値</textarea>
のようにタグで囲んだ部分を初期値として設定。フォームの初期値として編集したい内容を表示する。edit
アクションでURLのidと同じidの投稿データをデータベースから取得し、そのcontent
の値(=当行の内容)を初期値に設定する。
def edit
@post=Post.find_by(id: params[:id])
end
<textarea> <%= @post.content %> <textarea>
#フォームの値の受け取り
入力内容を受け取るためのupdate
アクションを追加する。update
アクションはフォームの値を受け取るのでルーティングをpost
にする。特定のidの投稿を更新するので、URLにidを含める。(投稿を編集した後は投稿一覧ページにリダイレクトされるのでビューは不要)
post "posts/:id/update" => "posts#update"
def update
redirect_to("/posts/index")
end
フォームで入力した内容をデータベースに保存するためには、フォームのデータをupdate
アクションに送信する必要がある。form_tag
メソッド(簡単に入力フォームに必要なHTMLを作成する)を用いて、送信先を指定する。
<%= form_tag("/posts/#{@post.id}/update") do %>
<textarea> <%= @post.content %> </textarea>
<input type="submit" value="保存">
<% end %>
##updateアクションの中身を作成
1. URLに含まれたidを用いて、データベースから投稿データを取得する。
<%= form_tag("/posts/#{@post.id}/update") do %>
post "posts/:id/update" => "posts#update"
def update
@post=Post.find_by(id: params[:id])
2. フォームから編集内容を受け取り、投稿データを更新する。
<textarea name="content" > ...</textarea>
def update
@post.content=params[:content]
@post.save
#getとpostの使い分け
get:データベースを変更しないアクション
post:データベースを変更するアクション
#削除機能の作成
destroy
アクションのルーティングもpost
にする。post
用のリンクを作るためには、link_to
の第三引数に{method: "post"}
を追加する。
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"} ) %>