URLの長さに関しては特に決まった制限はないものの、IEは約2000文字でブチッと切られるという仕様のようで、検索条件が大量にあるformだと検索はできるものの、画面に検索フォームに戻るリンクを作って移動するとクエリパラメータが壊れて検索条件が復元できなくなったりします。
通常の画面遷移編
そこで、検索フォームのメソッドをPOSTに変更し、検索フォームに戻るリンクでもdata-method="post"
にするようにしてみましたが、これでも結局クエリパラメータが渡されるため、壊れました。
<% # IEでダメなやつ %>
<%= link_to "戻る", search_path(search_params), method: :post %>
こうなると、search_params
をループしてhiddenパラメータを作ったformを作らないといけないのか…と考えていたら、実はそういうメソッドがすでにあることを知りました。button_to
メソッドです。
<%= button_to "戻る", search_path, params: search_params %>
画面遷移をする場合は、button_to
メソッドを使えば楽ですね!
これは確認画面からフォームに戻るときにも使えそう。
ソートのリンクやpaginationのリンク
通常の画面遷移のところで指摘したように、link_to
メソッドのオプションに、method: :post
にしただけでは壊れてしまいます。(URLが長すぎる場合)
しかし、Ajaxにしてこのように書くと、うまくいくらしいです。
<% # ちゃんと全てのパラメータがPOSTされる %>
<%= link_to "リンク",
search_path,
data: { params: search_params },
method: :post,
remote: true
%>
data-params
にJSON形式でデータを渡すと、ちゃんとhiddenパラメータに変換してAjaxでPOSTされます。
これがうまくいくんだったら、remote: true
を削除して通常の画面遷移でもうまくいきそう!に見えるんですが、削除するとdata-params
を完全に無視した結果になるだけです。辛い。
<% # ダメなやつ %>
<%= link_to "リンク",
search_path,
data: { params: search_params },
method: :post
%>
現状としては、ransackやkaminariで作られたリンクで、URLが超長い場合はAjaxで画面描画するようにテンプレートを修正するのがいいのかなぁと考えています。