CodeZine(コードジン)

特集ページ一覧

Railsを使ってURLパラメータの引き渡しと読み込みを行う方法

RailsのURLパラメータの勘違いしやすいポイント

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

 Ruby on Rails(RoR)は、URLパラメータの引き渡しと読み込みに関して言えば、非常に使いやすいフレームワークとして知られてきました。その一方で、URLパラメータは単純な文字列として渡されるという共通認識があります。本稿では、RoRがURLパラメータをどのように表現するか、そしてユーザーがこの情報をどのように利用してURLパラメータを効果的かつ効率的に解析し、使用できるかを説明します。

目次

はじめに

 Ruby on Rails(RoR)は、URLパラメータの引き渡しと読み込みに関して言えば、非常に使いやすいフレームワークとして知られてきました。その一方で、URLパラメータは単純な文字列として渡されるという共通認識があります。本稿では、RoRがURLパラメータをどのように表現するか、そしてユーザーがこの情報をどのように利用してURLパラメータを効果的かつ効率的に解析し、使用できるかを説明します。

RailsとURLパラメータ

 まず、Railsでのパラメータの引き渡しについて、例を用いて説明します。リスト1に、ローカルマシン上の受信サーバーに送られる一連のパラメータを含んだURLを示します。

リスト1
http://localhost/users/create?user[first_name]=dhanabal&user[last_name]=arumugam&arr []=1&arr []=7&arr []=3&id=15

 Railsのユーザーであれば、usersはコントローラクラスUsersControllerを指し、createUserControllerクラス内のメソッドであることがすぐに分かるでしょう。

 次の部分が、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
図1

 図1を見ると一目瞭然ですが、Railsでは、主なURLパラメータを、キーと値を含む単純なHashMapにマッピングしています。引き渡される idパラメータについては、値15が、値セクションに直接保持されます。ただし、userのような複雑なパラメータの場合は、値フィールドにはHashMapのアドレスが保持され、実際の値もここに置かれます。配列arrも、userパラメータと同様に処理されます。

RailsコードとパラメータのHashMap

 URLパラメータの内容と、RailsがこのURLパラメータをどのように構造化しているかを分析してみると、パラメータを簡単に渡す方法が見えてきます。例えばリスト2のようなコードが考えられます。

リスト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フィールドには、それぞれuserid、およびarrが保持される可能性があります。パラメータのタイプが配列である場合(つまりarrパラメータの場合)も、同様に値が出力されます。しかし、userのような複雑なタイプの場合は、値はさらに解析され、サブキーとそれぞれの値が抽出されます。userの場合、これ以降の繰り返しにおいて、サブキー「k」が値 first_nameおよびlast_nameをそれぞれ保持します。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

著者プロフィール

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5