Webエンジニア目指して#38

どうも桃鉄マンです

名古屋に戻ったということで、久しぶりに友人と集まり桃鉄スマブラをしました。やっぱりオフラインじゃないと得られる楽しさが違いますね。最高の時間でした

さてProgateのRails IVです

getとpostの違い

get...データベースに変更を加えない post...データベースに変更を加える

データベースからレコードを編集する流れ

変数A=モデル名.find_by(編集対象のカラム名:値)
変数A.内容を変更したいカラム名
変数A.save

編集ページの作成

詳細ページから編集ページへのリンク(detail.html.erb)

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

link_toを使って閲覧中の詳細レコードのidを取得し編集ページへ飛ばす

編集ページ(edit.html.erb)

    <textarea name="message"><%= @post.message %></textarea>
    <input type="submit" value="保存">

後述のactionから対象のレコードのmessageカラムを取得しtextareaのデフォルト表示にする

routing

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

このように変数は末尾じゃなくても仕込める

controller

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

:idをURLから拾って、編集対象のレコードを取得する

編集機能の実装

編集ページ

<%= form_tag("/post/#{@post.id}/update") do %>
    <textarea name="message"><%= @post.message %></textarea>
    <input type="submit" value="保存">
  <% end %>

form_tagを使って:messageをupdateアクションに送信

routing

post 'post/:id/update' => 'post#update'

:idも一緒に送信する

action

def update
    @post=Post.find_by(id: params[:id])
    @post.message=params[:message]
    @post.save
    redirect_to("/post/index")
  end

編集対象レコードを取得し、編集内容の:messageをmessageカラムに代入し、saveメソッドを実行→投稿一覧にリダイレクト

結果

f:id:misokatsu_sand:20210304210916g:plain

データベースからレコードを削除する流れ

変数A=モデル名.find_by(編集対象のカラム名:値)
変数A.destroy

削除機能の実装

routing

post 'post/:id/delete' => 'post#delete'

今回は直でdestroyメソッドのactionへ通したい

詳細ページから削除actionへのリンク

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

link_toはgetで記述されたactionしか検索しないらしい
このように第3引数に,{method:"post"}をつけることでpostで記述したものを検索してくれる

action

def delete
    @post=Post.find_by(id: params[:id])
    @post.destroy
    redirect_to("/post/index")
end

対象レコードを取得しdestroyメソッドで削除、一覧へリダイレクト

結果

f:id:misokatsu_sand:20210304221900g:plain

なんかもう意匠すれば掲示板できますね。 Rails IV、終わり!ではでは。