はじめに
Ruby on Rails(RoR)は、URLパラメータの引き渡しと読み込みに関して言えば、非常に使いやすいフレームワークとして知られてきました。その一方で、URLパラメータは単純な文字列として渡されるという共通認識があります。本稿では、RoRがURLパラメータをどのように表現するか、そしてユーザーがこの情報をどのように利用してURLパラメータを効果的かつ効率的に解析し、使用できるかを説明します。
RailsとURLパラメータ
まず、Railsでのパラメータの引き渡しについて、例を用いて説明します。リスト1に、ローカルマシン上の受信サーバーに送られる一連のパラメータを含んだURLを示します。
http://localhost/users/create?user[first_name]=dhanabal&user[last_name]=arumugam&arr []=1&arr []=7&arr []=3&id=15
Railsのユーザーであれば、users
はコントローラクラスUsersController
を指し、create
はUserController
クラス内のメソッドであることがすぐに分かるでしょう。
次の部分が、create
メソッドのパラメータになります。
"user[first_name]=dhanabal&user[last_name]=arumugam&arr[]=1&arr []=7&arr []=3&id=15"
通常、URLパラメータは、「name=tom&age=21」のように、単純な名前/値ペアとして送信されます。Railsの規則でも、パラメータは名前/値ペアとして送信されますが、若干の相違点があります。Railsでは、パラメータの引き渡しを簡素化し、モデルオブジェクトとモデル属性によってパラメータを修飾するという方法でオブジェクトリレーショナルマッピングを行います。上記の例では、user
はモデル(テーブル)ユーザーにマッピングされ、first_name
はモデルクラス(テーブルユーザーのfirst_name列)のfirst_name
属性にマッピングされます。
配列
Railsでは、値の配列をパラメータとして送信することもできます。リスト1では、値arr []=1&arr []=7&arr []=3
は配列を表します。配列の名前は「arr」で、値はそれぞれインデックス0、1、および2にあたります。
RailsパラメータとHashMap
すべてのURLパラメータは、Rail内部ではHashMapとして表されます。これは、URLパラメータは単純な文字列以外では送信されないという一般的な考えに反しています(とは言え、Railsでは単純な文字列としてパラメータを読み込めないというわけではありません)。上記の例でHashMapとしてパラメータを内部的にマッピングした様子を、図1に示します。
図1を見ると一目瞭然ですが、Railsでは、主なURLパラメータを、キーと値を含む単純なHashMapにマッピングしています。引き渡される id
パラメータについては、値15が、値セクションに直接保持されます。ただし、user
のような複雑なパラメータの場合は、値フィールドにはHashMapのアドレスが保持され、実際の値もここに置かれます。配列arr
も、user
パラメータと同様に処理されます。
RailsコードとパラメータのHashMap
URLパラメータの内容と、RailsがこのURLパラメータをどのように構造化しているかを分析してみると、パラメータを簡単に渡す方法が見えてきます。例えばリスト2のようなコードが考えられます。
1 params.each {|key,value| 2 puts "key=>#{key}" 3 if value.class.to_s != "String" 4 value.each {|k,v| 5 puts "Hash inner key=>#{k}" 6 puts "Hash inner value=>#{v}" 7 8 elseif value.class.to_s != "array" 9 puts "Hash inner key=>#{key}" 10 puts "Hash inner value=>#{value}" 11 else 12 puts "single Hash=>#{value}" 13 end
リスト2の例では、行1でURLパラメータが実際に解析されます。Railsでは、URLパラメータはデフォルトオブジェクトparams
に保存されています。params
はハッシュデータ構造を備えています。key
がシンプルな値の場合は、行12で示すように出力されます。今回の例では、key
フィールドには、それぞれuser
、id
、およびarr
が保持される可能性があります。パラメータのタイプが配列である場合(つまりarr
パラメータの場合)も、同様に値が出力されます。しかし、user
のような複雑なタイプの場合は、値はさらに解析され、サブキーとそれぞれの値が抽出されます。user
の場合、これ以降の繰り返しにおいて、サブキー「k
」が値 first_name
およびlast_name
をそれぞれ保持します。