私は自分自身でリモートフォームを広範囲に持っており、ほとんどの場合、それらを避けます。ただし、レイアウトやUXで、ページ全体を再読み込みしたり更新したりせずに、オンザフライのドロップダウンフォームが必要になる場合があります。
それで、これに段階的に取り組みましょう。
1.正規形の二重投稿の防止
通常のフォームでも、クリックが登録されてアクションが開始されたことが明確に示されない場合、ユーザーはボタンをダブルクリックするか、複数回クリックする可能性があります。
これを表示する方法はたくさんありますが(javascriptなど)、Railsで最も簡単な方法は次のとおりです。
= f.button :submit, :disable_with => "Please wait..."
これにより、最初のクリック後にボタンが無効になり、クリックが登録されてアクションが開始されたことを明確に示します。
2.リモートフォームの処理
リモートフォームの場合、それほど違いはありませんが、違いはおそらく次のとおりです。後で何が起こるか。
リモートフォームには、いくつかのオプションがあります。
- エラーの場合:フォームをエラーで更新します。
- フォームを開いたままにして、ユーザーがデータを入力し続けることができるようにします(これはあなたの場合だと思いますか?)
- ユーザーをある場所にリダイレクトします。
それらのケースを処理させてください。これらの3つのケースは、通常のフォームを実行する場合は完全に標準であることを理解してください。ただし、リモート呼び出しを行う場合はそうではありません。
2.1エラーの場合
リモートフォームを正しく更新するには、もう少し魔法をかける必要があります。それほど多くはありませんが、少しです。
hamlを使用すると、次のedit.js.haml
ようなビューが表示されます。
:plain
$('#your-form-id').replaceWith('#{j render(:partial => '_form') }');
これが行うこと:完全なhamlをフォームのみに置き換えます。これを機能させるには、それに応じてビューを構成する必要があります。それは難しいことではありませんが、必要なだけです。
2.2フォームのクリア
2つのオプションがあります。*エラーの場合と同様に、フォームを完全に再レンダリングします。投稿したばかりの要素ではなく、新しい要素からフォームをレンダリングするようにしてください。*代わりに次のJavaScriptを送信してください。
$('#your-form-id').reset();
これによりフォームが空白になり、通常、その後のクリックが効果的に役に立たなくなります(一部のクライアント検証では、一部のフィールドに入力するまで投稿がブロックされる可能性があります)。
2.3リダイレクト
リモートフォームを使用しているため、リダイレクトすることはできません。これはクライアント側で行われる必要があるため、少し複雑になります。
もう一度hamlを使用すると、これは次のようになります
:plain
document.location.href = '#{@redirect_uri}';
結論
リモートフォームを使用して2回(3回、4回、その他)の投稿を防ぐには、次のことを行う必要があります。
- 最初のクリック後にボタンを無効にします(使用
:disable_with
)
- 送信に成功したらフォームをクリアします(フォームをリセットするか、新しい要素でレンダリングします)
お役に立てれば。