[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へ
更新を完了しました表記など