パラメータ(params, query_paramters, path_parameters)取得方法メモ

params だとpathパラメータまで混じってたので、クエリパラメータだけ取る方法などを調べてみたメモ。


hoge コントローラに indexアクションが存在している状態で、
config/routes.rb は以下とします。

ActionController::Routing::Routes.draw do |map|
  map.edit_hoge '/hoge/:id/edit', :controller => 'hoge', :action => 'index'

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end




/hoge?aaa=1&bbb=2 にアクセスした際の、各パラメータハッシュなどの中身は以下。

{"aaa"=>"1", "bbb"=>"2", "action"=>"index", "controller"=>"hoge"}    # params
{"aaa"=>"1", "bbb"=>"2"}                     # request.query_parameters
{"action"=>"index", "controller"=>"hoge"}    # request.path_parameters
Parameters: {"aaa"=>"1", "bbb"=>"2"}         # log に出力されるやつ




/hoge/1234/edit?aaa=1&bbb=2

{"aaa"=>"1", "bbb"=>"2", "action"=>"index", "id"=>"1234", "controller"=>"hoge"}    # params
{"aaa"=>"1", "bbb"=>"2"}                                 # request.query_parameters
{"action"=>"index", "id"=>"1234", "controller"=>"hoge"}  # request.path_parameters
Parameters: {"aaa"=>"1", "bbb"=>"2", "id"=>"1234"}       # log に出力されるやつ


つまり、request.path_parameters では、URLのパス内に含まれているパラメータのみが取得でき、
request.query_parameters では、クエリパラメータ(クエリストリングのパラメータ)のみが取得できます。
で、params は、その両方が取れると。
development.log などに出力されている Parameters は特殊な感じで、
path_parametersとquery_parametersの両方が出力されてるけど、actionとかcontrollerは入ってません。


このlogのParameters と同じ値が得られそうな変数は見当たらなかったので、
必要になることがあるかは謎だけど、出力しているであろう箇所を調べてみました。


たぶん actionpack の action_controller/base.rb の以下のメソッド。

      def log_processing_for_parameters
        parameters = respond_to?(:filter_parameters) ? filter_parameters(params) : params.dup
        parameters = parameters.except!(:controller, :action, :format, :_method)

        logger.info "  Parameters: #{parameters.inspect}" unless parameters.empty?
      end

で、filter_parameters はログりたくないパラメータ(passwordとか)を設定してログにはかないようにすることができるものっぽいので、設定をしていなければ関係なくて、

基本的に、log の「Parameters:」は、paramsからcontroller, action, format, _method を除外して出力しているものと思ってよさそうです。

      • -

【2010-11-15 追記】

query_parameters はあくまでもquery_stringをハッシュ化したもので、
formからPOSTで送信したときなどのパラメータは含んでいませんでしたorz

なので、その際にも純粋(?)なパラメータだけを得るには、以下のようにするしかないのかなと思いました。

query_params = params.dup
request.path_parameters.each_key{|k| query_params.delete(k)}

こんなことしなくても、何か良いメソッドなり変数なりがありそうな気もするんですけどね、自分が知らないだけで。。。