【rails】「UPDATE」updateアクション

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

CRUD(クラッド)とは

Create・Read・Update・Delete のこと

Webアプリケーションの基本的な機能をすべて備えているものを「CRUDアプリ」という

Update

「Update」(PUTリクエスト)のupdateアクションを編集する

  • データを変更する

※ プットのことをパッチと呼ぶ人もいる 違いは特にない

前回、記事編集のeditアクションを定義したところ

今回、実装したいこと

updateアクション:該当ページの編集・更新をする


記事を編集する

:updateを作る

config/routes.rbにコードを追加する

  resources :articles,
  only: [:show, :new, :create, :edit, :update]

「GET」「PATCH」「PUT」

もともとあったarticle_path「GET」の下に、「PATCH」と「PUT」が生まれている

urlは同じだがリクエストが異なる

  • GET → 記事を表示する
  • PATCH → 記事を更新する

編集ページを作成する

edit.html.erbはnew.html.erbとほぼ同じになる


フォームタグを変更する

newのままだと以下のとおりになる

<%= form_with(model: @article, url: articles_path, method: 'post', local: true) do |f| %>

model: @article

前回editアクションで設定済み

該当:idの記事が初期表示されるようになっているので、このままでok


url: ◯◯, method: ‘ ◯◯’

「url: articles_path, method: ‘post’」のままだと「POST」リクエストされてしまう

↓「url: article_path, method: ‘put’」に書き換える

さらに「:id」を渡す必要があるので、article_path(@article)となる

最終的のコードは以下のとおりになる

<%= form_with(model: @article, url: article_path(@article), method: 'put', local: true) do |f| %>

【参考】

railsは賢いので、実はurlとmethodは省略しても察してくれる

<%= form_with(model: @article, local: true) do |f| %>

updateアクション

app/controllers/article_controller.rbで以下のコードを書く

    def update
        @article = Article.find(params[:id])
        if @article.update(article_params)
            redirect_to article_path(@article),
            notice: '更新できました'
        else
            flash.now[:error] = '更新できませんでした'
            render :edit
        end
    end

@article = Article.find(params[:id])

どの記事を編集するのか?

→ @article = Article.find(params[:id])で対象のarticleを探す

PUTリクエストされると同時に:idも渡されるので、(params[:id])で受け取る

該当の記事をArticle.findで探し、@articleに入れて編集可能にする


@article.update(article_params)

.updateで値を更新できるようになっている(.saveと似ている)

updateの中身は、private内で定義した(article_params)を指定する

    private
    def article_params
        params.require(:article).permit(:title, :content)
    end

createアクションと同様、フォーム内の:title:contentをデータベースに保存させることができる


編集内容が保存できた場合

if @article.update(article_params)
            redirect_to article_path(@article),
            notice: '更新できました'
  1. 記事の詳細ページarticle_path(@article)へ遷移redirect_toする
  2. 「更新できました」とFlash表示notice:させる

編集内容が保存できなかった場合

        else
            flash.now[:error] = '更新できませんでした'
            render :edit
  1. 「更新できませんでした」とFlash表示flash.now[:error]させる
  2. :edit(edit.html.erb)のviewを表示renderさせる

#DAY13