Rails 投稿の編集&削除機能の追加

 

今回の記事では

  • 編集機能の追加
  • 削除機能の追加

を説明します。

 

まず編集機能ですが、これは仕組み自体は新規投稿と一緒で、違うのは新しく作り出して保存する事と値を取得して保存する事です。

削除も編集機能の値の処理が少し違うだけなのでここでは一緒に記述していきます

まずルーティング

〜省略

get "posts/index" => "posts#index"

get "posts/new" => "posts#new"

get "posts/:id" => "posts#show"

post "posts/create" => "posts#create"

get "posts/:id/edit" => "posts#edit"

post "posts/:id/update" => "posts#update"

post "posts/:id/destroy => "posts#destroy"

〜省略

新しく記述したものは太字です

:idは複数の物からそれぞれの固有のデータを取得する必要があるものルーティングの中に入っています

 

次にコントローラ内に空でいいのでそれぞれのアクションを追加します

 

そしてまずshow.html.erbファイル内に

編集・削除のリンク項目を追加します

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

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

この{method: "post"}というのは直接link_toでルーティングにpostを持つアクションに飛ばしたい時に指定します(postはgetと違って.html.erbのファイルを作らないから)

 

次にedit.html.erbファイルを作成します

ファイル内には

〜省略

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

  <div>

    < textarea name="content">

<%= @post.content %>

</textarea>

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

  </div>

  <% end %>

form_tagは新規投稿と同じでupdateアクションへ送信するためで、そのために textarea内のnameにcontentを指定しています

<%= @post.content %>は初期値として入力される内容です

 

最後にコントローラ

〜省略

def edit

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

end

普通に値を取得しているだけです

投稿に失敗した際の初期表示のための定義ですね

def update

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

  @post.content = params[:content]

  @post.save

  redirect_to("/posts/index")

end

まず値を取得し、textareaのnameで指定されているcontentを取得した後に保存して投稿一覧に遷移しているという意味です

def destroy

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

  @post.destroy

  redirect_to("/posts/index")

end

値を取得し、削除、一覧へ遷移、簡単ですね、削除機能で気をつけるのはlink_toでのメソッドを"post"に指定するのを忘れない事です

 

今回はかなり雑になりましたがこれで終わります。

かなり頭で整理出来てきました。

f:id:takayanagi-prg:20180912033548j:image