SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

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

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

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

 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をそれぞれ保持します。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
RailsパラメータとNet::Http

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Raveendran V(Raveendran V)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Dhanabal Arumugam(Dhanabal Arumugam)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Gururaj B Rao(Gururaj B Rao)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Raghavendra Sesandra Nanjundappa(Raghavendra Sesandra Nanjundappa)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3686 2009/04/06 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング