0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Trubo を使って複数のパーシャルを更新する

Last updated at Posted at 2024-01-16

はじめに

本記事は猫でもわかるHotwire入門 Turbo編を参考にしています。
勉強中のため、誤りやもっといいやり方があるかも知れません。
その場合は、ご指摘いただけますと幸いです。

また、可能な限りわかりやすく記載するつもりですが、不明瞭な点、追記した方がいい点などがございましたら、合わせてご教授ください。

この記事の目的

コントローラーで値を更新し、画面に表示されている値だけでなく、フラッシュメッセージなど複数のパーシャルを更新したことがあると思います。
その際、やり方を調べるのに時間がかかったので、備忘録も兼ねて残しておきます。

パーシャルの記述

更新したい箇所に、タグを挿入します。

# ここに書いてあるコードはリロードされない
h2 hogeページ

= turbo_frame_tag "hoge", data: { turbo: true } do

  # データの更新に伴い、一緒にリロードしたい箇所

app/view/hoge/update.turbo_stream.slim を作成します。
このファイルは、update メソッドが呼ばれた時に読み込まれます。
create の時は、create.turbo_stream.slim にします。

# app/view/hoge/update.turbo_stream.slim

# update は、要素のコンテツのみ更新
= turbo_stream.update 'hoge'
  = render 'hoge/hogehoge'

# 共通の処理は、ApplicationHelper に定義して、呼び出すことも可能
= turbo_stream_replace_flash('route')

#############################################################
# application_helper.rb
  def turbo_stream_replace_flash(route)
    # replace は、要素も含めてすべて置き換える
    turbo_stream.replace 'flash', partial: "#{route}/flash", locals: { ver: 5 }
  end

turbo_stream.updateturbo_stream.replace の違いは、要素のコンテンツのみを更新するか、既存の要素を完全に置き換えるかの違いです。

コントローラーの記述

# app/controllers/hoge_controller.rb

class HogeController < ApplicationController
  def update
    if @hoge.save
      respond_to do |format|
        format.turbo_stream do
          flash.now[:notice] = '変更しました'
        end
      end
    else
      render :edit
    end
  end
end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?