はじめに
最近の開発で、Rails アプリケーションにおいて、あるページから特定のクエリパラメータを引き回して連携先の外部サイトのページに遷移したい、というケースがありました。
そのときに調べたことを備忘として残しておきます。
やりたかったこと
あるページを開いたときに、Google アナリティクスのパラメータを次のページにも渡したいというケースを考えます。例えば、以下の URL (PostsController#show
)でパラメータを指定し、
https://hogehoge.com/posts/1?utm_source=xxxx&utm_medium=yyyy
以下の URLに遷移したときに、
https://fugafuga.com/?utm_source=xxxx&utm_medium=yyyy
上記のように utm_source
と utm_medium
というパラメータのみ、外部サイトの URL に渡したいと思っていました。
やったこと
Controller で引き回すパラメータを絞る
上記の例踏まえ説明しますと、まずコントローラーの処理 PostsController#show
で、引き渡す対象のパラメータを params.permit
で絞り、余計なパラメータを渡さないようにします。
また後ほど処理しやすいように、to_h
で Hash クラスのオブジェクトにしておきます。
def show
@params_to_transit = params.permit(
:utm_source, :utm_medium
).to_h
end
Helper でパラメータ付き URL を生成する
次に、 PostsController#show
の view に指定する URL に helper の処理を噛ませます。
def url_with_params(url, params = {})
uri = URI.parse(url)
uri.query = URI.encode_www_form(params.to_a)
uri.to_s
end
URI.encode_www_form
を使うことで、以下の Hash クラスのパラメータを、
{
'utm_source' => 'xxxx',
'utm_medium' => 'yyyy'
}
以下のような形式に変換してくれます。
?utm_source=xxxx&utm_medium=yyyy
View でパラメータ付き URL でリンクを作成する
view には以下のような指定をしてリンクを準備しておきます。
= link_to '外部サイトへ', url_with_params('https://fugafuga.com', @params_to_transit)
これによって、PostsController#show
で渡されたパラメータを外部サイトの URL に引き渡すことができました。
終わりに
一つ一つパラメータを指定する方法でもできたのですが、複数パラメータがあるときは処理が煩雑になりそうだったので、URI
クラスのメソッドを使って一括で処理できるようになりました。
一旦こちらの方法で実現できましたが、他にいいやり方あれば教えていただけるとありがたいです。