よくある質問
親ルートローダーでユーザーを検証して、すべての子ルートを保護するにはどうすればよいですか?
それはできません😅。クライアント側の遷移中、アプリをできるだけ高速にするために、Remixはすべてのローダーを別々のフェッチ要求で並行して呼び出します。それぞれのローダーは独自の認証チェックを行う必要があります。
これは、Remixを使用する前と同じである可能性があり、今は単に明確になっているだけです。Remix以外では、「APIルート」に複数のフェッチを行う場合、それらのエンドポイントのそれぞれがユーザーセッションを検証する必要があります。言い換えれば、Remixルートローダーは独自の「APIルート」であり、そうとして扱う必要があります。
ユーザーセッションを検証する関数を作り、それを必要とするルートに追加することをお勧めします。
これで、ユーザーセッションを必要とするローダーまたはアクションでは、この関数を呼び出すことができます。
セッション情報が必要なくても、この関数は引き続きルートを保護します。
1つのルートで複数のフォームを処理するにはどうすればよいですか?
YouTubeで視聴
HTMLでは、フォームはaction
プロパティで任意のURLに投稿でき、アプリはそのURLにナビゲートします。
Remixでは、アクションはフォームがレンダリングされているルートにデフォルトで設定されているため、UIとそれを処理するサーバー側のコードを簡単に配置できます。開発者はしばしば、このシナリオで複数のアクションをどのように処理するか疑問に思います。2つの選択肢があります。
- 行いたいアクションを決定するフォームフィールドを送信する
- 別のルートに投稿して、元のルートにリダイレクトする
オプション(1)は、UIにバリデーションエラーを戻すためにセッションを操作する必要がないため、最もシンプルであることがわかります。
HTMLボタンは値を送信できるので、これが実装する最も簡単な方法です。
古いブラウザバージョンでは、SubmitEvent: submitter プロパティまたはFormData() コンストラクターの submitter パラメーターをサポートしていない可能性があるため、この機能が壊れる可能性があります。これらの機能のブラウザ互換性を必ず確認してください。ポリフィルが必要な場合は、Event Submitter ポリフィルとFormData Submitter ポリフィルを参照してください。詳細については、関連する問題remix-run/remix#9704をご覧ください。
フォームに構造化されたデータを含めるにはどうすればよいですか?
application/json
のコンテンツタイプでフェッチを行うことに慣れている場合は、フォームがどのように当てはまるのか疑問に思うかもしれません。FormData
はJSONとは少し異なります。
- ネストされたデータを持つことはできません。単なる「キー値」です。
- JSONとは異なり、_同じキーに複数のエントリを持つ_ことができます。
構造化されたデータを送信したい場合は、単に配列を投稿するために、同じキーを複数の入力に使用できます。
各チェックボックスの名前は「category」です。FormData
は同じキーに複数の値を持つことができるため、JSONは必要ありません。アクションではformData.getAll()
を使用してチェックボックスの値にアクセスします。
同じ入力名とformData.getAll()
を使用すると、ほとんどの場合、構造化されたデータをフォームに送信したい場合に役立ちます。
それでもネストされた構造を送信したい場合は、標準ではないフォームフィールドの命名規則とnpmのquery-string
パッケージを使用できます。
そして、アクションで
一部の人は、JSONを非表示フィールドにダンプすることさえあります。この方法は、プログレッシブエンハンスメントでは機能しないことに注意してください。それがアプリにとって重要ではない場合は、構造化されたデータを簡単に送信できます。
そして、アクションでそれを解析します。
繰り返しますが、formData.getAll()
は多くの場合で十分です。ぜひ試してみてください!