OKADA LABO

[Ruby on rails][editアクション][updateアクション]ユーザーが登録したレコードをユーザー自身が編集する

[editアクション]で編集内容を受け取り、[updateアクション]で編集を完了する。

たとえば、ユーザーがツイートを登録するアプリならば

 

・ルーティングの設定[editアクション]
config/routes.rb

get 'tweets/:id/edit' => 'tweets#edit'

・編集ボタンをユーザー投稿一覧viewファイルに
app/views/tweets/xxxxx.html.erb

<% @tweets.each do |tweet| %>

  <% if user_signed_in? && current_user.id == tweet.user_id %>
    <%= link_to '編集', "/tweets/#{tweet.id}/edit", method: :get %> ←ここ
  <% end %>

  <%= simple_format(tweet.text) %>
  <span>投稿者</span><%= tweet.user.nickname %>
<% end %>

・コントローラにeditアクションを定義する
app/controllers/tweets_controller.rb

def edit
  @tweet = Tweet.find(params[:id])
end

xxxx.html.erbのツイートにある編集ボタンを押すことによって、
そこから送られてくるtweetのparamsの:idで編集したいtweetをさがして@tweetに格納。

 

[editアクション]viewファイルに
編集内容を記述。情報を入力するためのフォーム。
app/views/tweets/edit.html.erb

<%= form_tag("/tweets/#{@tweet.id}", method: :patch ) do %>
  <h3>編集する</h3>
  <input placeholder="Image Url" type="text" name="image" value="<%= @tweet.image %>" autofocus="true">
  <textarea name="text" placeholder="text"><%= @tweet.text %></textarea>
  <input type="submit" value="SENT">
<% end %>

 

[updateアクション]ルーティング
config/routes.rb

patch 'tweets/:id' => 'tweets#update'

・コントローラにupdateアクションを定義する
app/controllers/tweets_controller.rb

def update
  tweet = Tweet.find(params[:id])
  if tweet.user_id == current_user.id
    tweet.update(tweet_params)
  end
end

edit.html.erbから送られてくる、「編集したいtweetのparamsの:id」で「編集したいtweetレコード」をさがして@tweetに格納。
あとは、同じようにif文で、パスでupdateされないようにして、
ストロングパラメータで更新完了する。
(当たり前ですがcreateとupdateで扱うカラムは同じストロングパラメータである。)
あとは[updateアクション]のviewファイルupdate.html.erbへ
更新を完了しました表記など