Schedule.select meets Hotwire

3.2K Views

May 01, 24

スライド概要

RubyKaigi事前勉強会@SmartHRでのスライドです

profile-image

どういうわけか暑がり

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Schedule.select meets Hotwire RubyKaigi 2024事前勉強会@SmartHR kinoppyd 2024-04-25

2.

だれおめー? kinoppyd プロダクト連携チーム プログラミング ロードバイク ポーカー CONFIDENTIAL

3.

Schedule.select 大幅にアップデートしたよ CONFIDENTIAL

4.

CONFIDENTIAL

5.

これまで ● SmartHR UI(React + styled-components) ● ERB + rails-ujs ● Webpacker CONFIDENTIAL

6.

大変だった点 ● SmartHR UIのアップデートに追従できない ● SPAではないので、制御がReactとRailsで分かれて いた ● ロジックがReact側に多くてテストが難しい CONFIDENTIAL

7.

これから ● TailwindCSS ● ERB + Turbo Frames + Turbo Streams ● esbuild CONFIDENTIAL

8.

どんな感じです? ● アセットのビルドめっちゃ速くて最高 ● テストがとにかく書きやすくなった ● Hotwireをガンガン使える CONFIDENTIAL

9.

Hotwireはいいぞ! CONFIDENTIAL

10.

Turbo ● 全体的に使ってる ● 特にスケジュール画面から予定を作るときに、ボタン を押してもリロードしなくなった ● ダイアログとかもTurbo Frames CONFIDENTIAL

11.

Stimulus ● スケジュールテーブルの日付切り替え ● ダイアログを出すボタン ● ロケールの予測や切り替え CONFIDENTIAL

12.

Happy CONFIDENTIAL

13.

まあでも大変なこともある CONFIDENTIAL

14.

TableとTurbo CONFIDENTIAL

15.

TableとTurbo Framesの相性 ● HTMLの仕様では、テーブルを構成するタグを他の タグで囲めない ● つまり、<turbo-frame>で<tr>とかを囲めない ● どうすればよい? CONFIDENTIAL

16.

TableはTurbo Streamsで書き換える ● Turbo Streamsは任意の要素を書き換えられる ● <tr>とかはStreamsで書き換えられる ● Frames と Streams のリクエストは共存できるので、 ケースによって切り替える CONFIDENTIAL

17.

まーでもメンドイ ● テーブルに対応するクラスを持ってるからIDとかは 発行できる ● でもStreamsは強い目的が無いとメンドイ ● Framesの気軽さが無いのが悲しいが仕方ない CONFIDENTIAL

18.

DialogとTurbo CONFIDENTIAL

19.

DialogとTurbo Framesもまあまあ大変 ● dialogの中身だけを書き換えるなら良い ● dialogのボタンを押すと、閉じて元の画面を更新とか が大変 ● 名前のバリデーションとか CONFIDENTIAL

20.

こういうやつとか CONFIDENTIAL

21.

こういうやつとか CONFIDENTIAL

22.

どうやったの ● 失敗時はDialogの中身をエラー付きでTurbo Framesで書き換え ● 成功時は元のリソースにリダイレクト ● リダイレクトはTurbo Framesが壊れるので、 breakoutする必要あり(セッションでやった) CONFIDENTIAL

23.

DialogとTurboのありかた ● そもそもDialogのボタンで閉じてリソースを更新みた いな行動をしないほうが良い ● SmartHR UIのデザインに寄せたので致し方なし ● Campfireだとダイアログも一つのViewにしてる CONFIDENTIAL

24.

エラーの出し分けがムズい CONFIDENTIAL

25.

エラーの出し分け? ● バリデーションが失敗するエラーと、例外が発生する エラーはそもそも違う ● ActiveRecord::NotFoundはrescueしたいが、valid? はそうではない ● でもこれTurbo Frames壊れる CONFIDENTIAL

26.

エラーの分類 ● rescueが必要なエラーは、本来UIからその操作がで きてはいけない ● なので、ユーザー操作できる範囲は422でTurbo Frames、それ以外はエラー画面へ ● ここでもframeがないのでbreakoutが必要になる CONFIDENTIAL

27.

これはあんまり良い解決策ではない ● リソースのエラーやvalidationを正確にハンドルする のは難しい ● エラーだけどエラー表示したくないときや逆もある ● どうすればいいんだろう……? 謎です CONFIDENTIAL

28.

モバイル対応 CONFIDENTIAL

29.

CONFIDENTIAL

30.

最後に CONFIDENTIAL

31.

トロフィ実装しときました CONFIDENTIAL

32.

それでは沖縄で お会いしましょう CONFIDENTIAL