Help us understand the problem. What is going on with this article?

Rails アプリケーションで現在ページ URL のクエリパラメータを遷移先 URL に引き回す

はじめに

最近の開発で、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_sourceutm_medium というパラメータのみ、外部サイトの URL に渡したいと思っていました。

やったこと

Controller で引き回すパラメータを絞る

上記の例踏まえ説明しますと、まずコントローラーの処理 PostsController#show で、引き渡す対象のパラメータを params.permit で絞り、余計なパラメータを渡さないようにします。

また後ほど処理しやすいように、to_h で Hash クラスのオブジェクトにしておきます。

posts_controller.rb
  def show
    @params_to_transit = params.permit(
      :utm_source, :utm_medium
    ).to_h
  end

Helper でパラメータ付き URL を生成する

次に、 PostsController#show の view に指定する URL に helper の処理を噛ませます。

application_helper.rb
  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 には以下のような指定をしてリンクを準備しておきます。

posts/show.html.haml
= link_to '外部サイトへ', url_with_params('https://fugafuga.com', @params_to_transit)

これによって、PostsController#show で渡されたパラメータを外部サイトの URL に引き渡すことができました。

終わりに

一つ一つパラメータを指定する方法でもできたのですが、複数パラメータがあるときは処理が煩雑になりそうだったので、URI クラスのメソッドを使って一括で処理できるようになりました。

一旦こちらの方法で実現できましたが、他にいいやり方あれば教えていただけるとありがたいです。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away