LoginSignup
8
10

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-31

はじめに

最近の開発で、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 クラスのメソッドを使って一括で処理できるようになりました。

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

参考

8
10
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
8
10