SHOEISHA iD

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

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

japan.internet.com翻訳記事

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

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

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

RailsパラメータとNet::Http

 Net:HTTPを使用してパラメータを送信しようとする場合、Railsには独特の性質が見られます。リスト3のUriを見てください。 Net::HTTPで'Accept' => 'text/xml''Accept' => 'image/jpeg'などを含むリスト3のようなUriを使用すると、2つ目の引数により、postおよびputメソッドのパラメータ(ハッシュ)に追加のパラメータ"A"=>""が発生します。

リスト3
response = http.post('/controller/action?id=1&type=user,
'Accept' => 'text/xml')

 この結果の内部構造は次のようになります。

params = {"id"=>1,"type"=>"user","A"=>""}
=> {"id"=>1,"type"=>"user","A"=>""}

 これにより、パラメータ全体を代入や演算で使用するときに問題が起こることがあります。リスト4の例を見てみましょう。この例では、リスト3で渡されたパラメータ(条件)に基づき、組の検索を試行しています。ユーザーは、リスト3に示したようにidtypeの2つのパラメータしか渡していないにもかかわらず、暗黙パラメータHashArrayのparamsには、「A」という名前の追加パラメータが含まれてしまいます。このパラメータ「A」が存在することにより、ルックアップ(照会)が失敗することがあります。

リスト4
model_obj = Model.find(:all,:conditions=>params)

 この結果、次のエラーが発生します。

ActiveRecord::StatementInvalid:
Mysql::Error:Unknown column 'model.A' in 'where clause':
SELECT * FROM model WHERE (model.`A` = ''
AND model.`id` = 1 AND model.`type` = 'user')

 この問題を解決するには、リスト5に示すように、要求のpostまたはputに対して空白の引数を使用します。

リスト5
response = http.post('/controller/action?id=1&type=user,'')

 あるいは、パラメータ「A」を明示的に削除します。

 また、名前が「A」のパラメータを次のような形式で引き渡すと、空白の"A"=>""が上書きされます。

http.post('/controller/action?A=abcd&id=1&type=user,'Accept'
=> 'text/xml')
注意

 上記の問題は、CURLを使用するときには発生しません。

Railsのパラメータと機能テスト

 通常、データはRailsの機能テスト(または単体テスト)からリスト6のような形で渡されます。リスト6では、3つのパラメータ、つまりidname、およびtypeをそれぞれ渡しています。

リスト6
post :create, :id => 300, :name => "ravi", :type => 1

 パラメータは単純な文字列として渡されるという通念がありますが、「RailsパラメータとHashMap」のセクションで説明したように、Railsにはこれは該当しません。RailsパラメータはHashMapに取り込まれます。この点は、機能テストまたは単体テストにも当てはまります。

 ブラウザまたはNet::HTTPから渡されるような一般的なURLパラメータであれば、パラメータを単純な文字列として解釈することも可能でしょうし、単純な文字列検索や正規表現、またはTreetopのような高度なツールを使ってパラメータの解析や検証を行うこともできるでしょう。文字列としてのパラメータ解析は、Treetopのようなツールでも、非常に効果的に行えます。しかしその一方で、ユーザーがコントローラの単体テストをすべて終え、Railsの機能テストの記述に取り掛かると、パラメータを単純な文字列として解析できないことに気付くでしょう。なぜなら、コントローラテストを通じて渡されるパラメータ(リスト6のパラメータ)は、文字列としてではなく「ペア」としてHashMapに渡されるからです。リスト2に示すパラメータを、常にパラメータとして読むと良いでしょう。

まとめ

 本稿では、RailsのURLパラメータに関してユーザーが勘違いしがちな点と、それに実際にどのように対処するべきかについて説明しました。

著者へのお問い合わせ

  • Raveendran V: raveendran_vadakkoot@infosys.com
  • Dhanabal Arumugam: dhanabal_arumugam@infosys.com
  • Gururaj B Rao: gururaj_rao@infosys.com
  • Raghavendra Sesandra Nanjundappa: raghavendra_n06@infosys.com

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
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)

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング