- ベストアンサー
RubyにおけるPOSTデータの処理方法は?
- Rubyを使用してPOSTされたデータを処理する方法について教えてください。
- Rails上でPOSTされたパラメータを受け取り、オブジェクトとして保存する方法を教えてください。
- paramsが配列の可能性がある上、a, b, cのキーが存在するか不明な場合のデータ処理方法についてアドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ああ、なるほど。そういう勘違いですね。Hash#[]で例外は発生しません。 その前にまず、 >代入された値、代入できなければnilが返ります。 代入演算子で、「代入できない」のはあり得ません。nilが返るのはnilを代入したときです。 >a = params[i]['a'] >この処理でもし、" params[i]['a'] "が存在せず、nilが代入されれば、 例外が発生しプログラムが停止すると思いますが、 しません。場合分けすると、 (1) 配列paramsのi番目がハッシュとして存在する場合 (2) 配列paramsのi番目がハッシュ以外で存在する場合 (3) 配列paramsのi番目が存在しない場合 ですが、今回は(2)(3)のケースは想定されていないと思いますので省きます。 (1)をさらに場合分けすると、 (1-1) そのハッシュにキー'a'が存在する場合 →対応する値が返る (1-2) そのハッシュにキー'a'が存在しない場合 →この場合はハッシュ生成時にデフォルト値を指定していないのでnilが返る どちらも例外は発生しません。 (1-2)の場合に、値の取り出しに[]メソッドでなく、fetch()メソッドを使うとキー無しの例外が発生します。この場合、 a=params[i].fetch('a') と書こうが、 if a=params[i].fetch('a') end と書こうが同じです。 if の条件部分は必ず実行されます(実行しないと値がわからないので)。 if の条件部分の値がnilやfalseだとthen部分が実行されません。 ハッシュからの値の取り出しは普通は[]を使い、キー無しの時に意図的に例外を発生させたいときにfetch()を使います。また、ロジックでキー有りキー無しで違う処理をさせたいときは、key?()を使います。 a = {} p a['X'] b = Hash.new("default value") p b['X'] p b.fetch('X')
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
>>>if分の部分で何がしたいのかわかりません。 >ifの条件式の部分で行いたい処理を行い、代入ができない場合、 >つまり返り値がnilである場合を、if側で処理して例外が発生しないようにしてます。 やっぱりわかりません。 if a = params[i]['a'] end のthen部分に何も書いてないのですが?何も書かないと、 a = params[i]['a'] と同じですよ。
補足
a = params[i]['a'] の式に返り値があるのはご存知ですか? 代入された値、代入できなければnilが返ります。 また、ifの条件式ではfalseはもちろんですが、nilを受け取っても実行されません。 逆に言うとfalseやnil以外では、実行されるということです。 a = params[i]['a'] この処理でもし、" params[i]['a'] "が存在せず、nilが代入されれば、 例外が発生しプログラムが停止すると思いますが、 if a = params[i]['a'] end だと、ifの条件式でnilを受け取り、例外が発生しません。 条件式の部分で、代入がちゃんと行われているので、thenの部分で処理する必要もありません。 rubyを触り始めて1週間程度ということもあり、私自身知識が浅いのと、 例外処理のやり方を調べるのがめんどくさいため、このような変態的な処理になっています。 余談ですが、 この方法は、C言語で似たようなことをしたことがあり、rubyでもやってみたらできたという感じです。 こういう変則的な書き方は、この本が参考になりました。 Short Coding ~職人達の技法~ http://www.amazon.co.jp/exec/obidos/ASIN/4839925232/
- notnot
- ベストアンサー率47% (4900/10358)
if分の部分で何がしたいのかわかりません。 キーが存在するかどうかは、if params.key?('a')のようにして調べます。 case1,2の統合は、下記のようにすれば出来ます。 [params].flatten.each do |prms| if a = prms['a'] ・・・ end
補足
>>if分の部分で何がしたいのかわかりません。 ifの条件式の部分で行いたい処理を行い、代入ができない場合、 つまり返り値がnilである場合を、if側で処理して例外が発生しないようにしてます。 存在するか確認して、代入するよりは文字数減るかもしれませんが、 わかりにくいですね。 普通に if params.key?('a') で処理します。 [params].flatten.each do |prms| if a = prms['a'] ・・・ end flatten.eachは初めて知りました。 使わせていただきます。 返答が遅くなりましたが、ありがとうございました。
お礼
>>a = params[i]['a'] >>この処理でもし、" params[i]['a'] "が存在せず、nilが代入されれば、 >>例外が発生しプログラムが停止すると思いますが、 >しません。場合分けすると、 さっそく試してみました。確かに例外が発生しませんでした。 私の完全な勘違いのようです。ご指摘ありがとうございます。 今回は、例外を意図的に発生させたいわけではないので、 fetchを使う必要はないです。 ながながとおつきあいいただきありがとうございました。 回りくどいコードを書かないよう努力します。