質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1218閲覧

GETで渡されるquery_parameterは自動でdecodeされるが同じ処理にredirect_toでquery_parameterを渡してもdecodeされない

kwrks

総合スコア1

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/07/20 12:59

前提

Rails 5.1.7
Ruby 2.6.6

疑問

アプリから GET で渡されたquery_parameterはControllerでparamとして取得すると既にUri_decodeされていますが、
一度redirect_to を経て同じ処理に同じparamを渡した場合はUri_decodeされません。

RailsのGitHubも読みましたが難解で、原因がわからなかったのでご存知の方にお知恵をお借りできればと思います。

該当のソースコード

ruby

1## Routes 2controller :hoge do 3 get '/hoge/huga', :to => 'hoge#huga', trailing_slash: true 4 get '/hoge/redirect_huga', :to => 'hoge#redirect_huga', trailing_slash: true 5end

ruby

1## Controller 2class HogeController < ApplicationController 3 4 def redirect_huga 5 encoded_params = { param_1: URI.encode_www_form_component(params[:param_1]) } 6 redirect_to hoge_huga_path + '?' + encoded_params.to_param 7 end 8 9 def huga 10 Rails.logger.info "params_1  #{params[:params_1]}" 11 end 12end

decodeされるリクエスト

GET https://test.dev/hoge/fuga/?param_1=https%3A%2F%2Ftest.jp%2Ftest%2F
// INFO -- : params_1 https://test.jp/test/

decodeされないリクエスト

GET https://test.dev/hoge/redirect_huga/?param_1=https%3A%2F%2Ftest.jp%2Ftest%2F
## INFO -- : params_1 https%3A%2F%2Ftest.jp%2Ftest%2Ftest%2F

質問が初めてなので不足がありましたらすみません。 できるだけ早く補足させていただきます。 何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

to_paramURI.encode_www_form_componentで二重にエンコードされてしまっているように思われました。

ruby

1encoded_params = { param_1: URI.encode_www_form_component(params[:param_1]) } 2redirect_to hoge_huga_path + '?' + encoded_params.to_param

ではなく、

ruby

1encoded_params = { param_1: params[:param_1] } 2redirect_to hoge_huga_path + '?' + encoded_params.to_param

とするか、あるいは、

ruby

1encoded_url = URI.encode_www_form_component(params[:param_1] 2redirect_to hoge_huga_path + '?param_1=' + encoded_url

としてみるとどうでしょうか。

なお、Rails.logger.info "params_1  #{params[:params_1]}"等でログに出力して調べるのは良い方法だと思います。

redirectの方でも、

ruby

1Rails.logger.info "params_1  #{params[:params_1]}" 2Rails.logger.info "params_1(URI.encode_www_form_component)  #{URI.encode_www_form_component(params[:params_1])}" 3Rails.logger.info "params_1(to_param)  #{encoded_params.to_param}"

などと出力して、何が起きているか確認すると良さそうです。

投稿2021/07/23 04:30

takahashim

総合スコア1877

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kwrks

2021/07/24 08:06 編集

ご回答ありがとうございます。 確認致しましたところ、ご指摘の通り、to_param と URI.encode_www_form_component で二重にエンコードされていたようでした。 大変お恥ずかしい話ですが、to_paramはparamの形式に変えてくれるだけだと思いこんでおり、Encodeは別途する必要があると思っておりました。 なお、確認の為ご助言の方法でlogを取得しましたところ、以下のように2重エンコードの様子が確認出来ました。 INFO -- : param_1 ;https://test.jp/test/ INFO -- : params_1 URI.encode ;https%3A%2F%2Ftest.jp%2Ftest%2F INFO -- : params_1(to_param) ;param_1=https%253A%252F%252Ftest.jp%252Ftest%252F 非常に丁寧なご指摘誠にありがとうございました。大変たすかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問