LoginSignup
6
6

More than 5 years have passed since last update.

RailsアプリのリンクでURLの長すぎる場合の対応方法を整理しておく

Posted at

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で画面描画するようにテンプレートを修正するのがいいのかなぁと考えています。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6