ターボリンクをホットワイヤーにアップグレード/移行する方法
13529 ワード
Render form errors
次の Rails 7 リリースでは、ホットワイヤーとスティミュラスが新しい Rails プロジェクトのデフォルトの JavaScript セットアップになります.最新のステップアップで既存の Rails アプリケーションを高速化するには、以下のガイドがターボリンクからホットワイヤーへの移行に役立ちます.
Devise と Rails UJS に関する注意事項
hotwire でデバイスを使用するには、いくつかの変更が必要です.実用的なガイドについては、GoRails episode を確認してください.
今のところ、Rails UJS は引き続き Hotwire と共存できます.以下のガイドは、Rails UJS がインストールされていることを前提に作成されています. UJS に完全に別れを告げたい場合は、この Drifting Ruby episode を確認してください.
インストール
gem hotwire-rails をインストールします. gem は以下をインストールするラッパーです.
刺激を既にインストールしている場合は、yarn または npm を使用してパッケージを削除します.例:
yarn remove stimulus@^2.0.0
.交換
# old
gem 'turbolinks'
# new
gem 'hotwire-rails'
実行
./bin/bundle install
実行 ./bin/rails hotwire:install
application.js
のターボリンク参照を削除します.// old
require("turbolinks").start()
// new
import "@hotwired/turbo-rails"
1. 刺激のインポートを置き換える
Stimulus JS が既にインストールされている場合は、既存の刺激コントローラーを更新する必要があります.インポート ライブラリを
@hotwired/stimulus
に設定します.// old
import { Controller } from "stimulus"
//new
import { Controller } from "@hotwired/stimulus"
2.ターボリンクの名前空間をターボに置き換えます
アプリにターボリンクの参照が含まれているかどうかを確認し、新しいターボ名前空間にスワップします.
例えば:
// old
document.addEventListener('turbolinks:load', ...)
// new
document.addEventListener('turbo:load', ...)
<!-- old -->
<%= link_to path, data:{turbolinks: false} do %>
<!-- new -->
<%= link_to path, data:{turbo: false} do %>
# old
Turbolinks.visit(location)
# new
Turbo.visit(location)
3.リモートフォームを無効にする
turbo-rails で説明されているように、
application.rb
で構成を設定して、すべてのリモート フォームを無効にします.config.action_view.form_with_generates_remote_forms = false
または、
local: true
を追加して、すべてのフォームを 1 つずつ変更することもできます.<!-- old -->
<%= form_with model: @task, url: task_path(@task), method: :put do %>
...
<% end %>
<!-- new -->
<%= form_with model: @task, url: task_path(@task), method: :put, local: true do %>
...
<% end %>
4. レンダリング フォーム エラー
4.1. GET ルートのフォーム
/new
または /edit
ページのようにページにエラーをレンダリングするために、else-leg でフォームをレンダリングするときに
status: unprocessable_entity
を追加します.# old
def create
@task = Task.new(task_params)
if @task.save
redirect_to tasks_path, notice: 'Task created.'
else
render :new
end
end
# new
def create
@task = Task.new(task_params)
if @task.save
redirect_to tasks_path, notice: 'Task created.'
else
render :new, status: :unprocessable_entity
end
end
4.2 モーダルのフォーム
ステップ 3.1 で
:unprocessable_entity
アプローチを使用しても、モーダルに表示されるフォームでは機能しません.この GoRails episode では、詳細なソリューションについて詳しく説明しています. status: :unprocessable_entity
の代わりに、新しい turbo_stream 形式を使用してエラーをレンダリングします. Turbo_stream.erb はフォーム ID を見つけて、それを新しい HTML テンプレートに置き換えます.これは、既存の
js.erb
テンプレートを新しい turbo_stream 形式に置き換える良い機会でもあります.# old
def create
@task = Task.new(task_params)
if @task.save
redirect_to tasks_path, notice: 'Task created.'
else
render :new
end
end
# new
def create
@task = Task.new(task_params)
if @task.save
redirect_to tasks_path, notice: 'Task created.'
else
respond_to { |format| format.turbo_stream }
end
end
次に、モーダル フォームに id を追加します. dom_id ヘルパー here について読んでください.
<!-- old -->
<%= form_with model: @task) do |f| %>
...
<% end %>
<!-- new -->
<%= form_with model: @task, id: dom_id(@task) do |f| %>
...
<% end %>
最後に、コントローラーのアクション名と一致する新しいファイルをビュー フォルダーに追加します:
create.turbo_stream.erb
<%= turbo_stream.replace "new_task", partial: "tasks/form", task: @task %>
new_task
は、dom_id(@task) によって生成されるフォームの ID を参照します. "tasks/form"
は、モーダル @task
は、フォーム 5. .js.erb を turbo_stream.erb に置き換えます
hotwire とその代替アプローチを使用して、ページのコンテンツを更新します.新しい Turbo_stream アプローチを活用したいと考えています.
読んでくれてありがとう.
質問?フィードバック?お知らせ下さい :)
Reference
この問題について(ターボリンクをホットワイヤーにアップグレード/移行する方法), 我々は、より多くの情報をここで見つけました https://dev.to/thomasvanholder/how-to-upgrade-migrate-turbolinks-to-hotwire-3e7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol