0

私は過去 3 日間、これについて頭を悩ませてきました (冗談ではありません!!!)....とても単純なことのように思えますが、私はそれを行うことができません。だから私はここに質問を出しています、そしてうまくいくどんな方法にもオープンです。

背景 : サーバーには大きすぎる URL を生成するために使用される送信時の高度な検索フォーム。そのため、フォームは POST 経由で送信する必要がありました。ここまでは順調ですね。フォームが正常に送信され、結果が表示されました。残りの問題はページネーションだけでした。

これは POST 呼び出しであるため、ページネーションは除外されました。will-pagination はパラメーターページを既存のパラメーターにマージしますが、問題はそれが URL に表示され、同じエラーが発生することです。

質問: ユーザーが次のリンクをクリックした場合、何か方法はありますか?

a) ページ パラメータを更新する

b) 既存のパラメーターを保持する

c) URLを変更しない場合

d) コントローラーのアクションに制御を戻しますか?

これまでに提案された唯一の解決策は、非表示のフォームを作成し、その値を再入力して再度送信することでした。フォームがかなり複雑なので、もっときれいな方法があれば知りたいです。

4

2 に答える 2

1

あなたのコメントからあなたが何を望んでいるのかわかります。それに応じて私の返信を編集します。並べ替えで選択されている列に関する情報を、URL 文字列で使用できるようにすることなくコントローラーで使用できるようにする必要があり、POST ではなく GET を使用する必要があります。

あなたが抱えている課題は、リクエスト間で状態を維持したいということであり、これを行うためのメカニズムが必要です。POST は、その情報を POST 要求の本文で送信することによって保持します。GET は、クエリ文字列を入力できるようにすることでこれを行います。状態を保持するもう 1 つの方法は、Cookie を使用することです。

ページ上で JavaScript を使用して URL を操作できます。そのためのチュートリアルがオンラインにあります。

しかし、コメントで言うように単純なコントローラーのハックが必要な場合、私が考えることができる最も簡単な方法は、ユーザーがクエリパラメーターを含む URL に対して GET 要求を行うことを許可し、この要求を 2 つのステップで処理することです。 - ステップ 1 でクエリ情報を Cookie に保存し、ステップ 2 でクエリ文字列データを削除した URL にリダイレクトします。ページのデータを作成する前に、Cookie を調べてこれらのフィールドがあるかどうかを確認します。ハックですが、動作します。

def sort
  session[:sort] = params[:sort]
  redirect_to url_without_the_query_string
end

新しい html 5 機能もあります。

window.history.replaceState(“Replace”, “Page Title”, “/mypage”);

このstackoverflowの回答から:javascriptを使用してURLからクエリ文字列を削除する方法

ただし、そのような読み込み後にURLをいじることをお勧めするかどうかはわかりません(その解決策について十分に知らないので、その回答を読んで、それが適合するかどうかを確認することをお勧めします)。そのため、URL 文字列からそのデータを失わなければならない場合は、リクエスト間で何らかの方法でデータを渡す必要があるため、POST を使用するか、上記で説明したセッション Cookie/リダイレクト メソッドを使用する必要があります。

于 2013-03-24T08:18:56.360 に答える
0

あなたのhtml<form>にはaction属性がありますか?そうでない場合は、ページを指すものを追加します。

POST の結果で を使用できるように現在の GET パラメータを保持する場合は、見出しリンクでトリガーされる JavaScript を変更して、クエリ文字列を変更するだけでなく (または変更する代わりに)、同じものを書き込む必要があります。非表示のフォーム フィールドへのデータ (もちろん、リクエストの本文にポストされます)。JS ライブラリには、そのための便利な関数が既に含まれている場合があります。

于 2013-03-24T13:31:47.953 に答える