- ベストアンサー
【ruby】クラスCGIを改造して、クエリの文字コードを変えたい
- RubyのCGIクラスを改造して、クエリの文字コードを自動的に変換する方法を探しています。
- Windowsサーバで使用しているため、取得したクエリ(フォームフィールド)をs-jisに変換する必要があります。
- 以前にはaliasを使用して同様のことを試みましたが、成功しませんでした。改造方法についてのご指導をお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
テストしてませんが、これでどうでしょう。 class MyCGI < CGI def initialize(type = "query") super @params = @params.each do|key,val| @params[key]=val.collect{|x|x.tosjis} end end end cgi=MyCGI.new if cgi.has_key?('arg') then STDERR.puts cgi['arg'] cgi.out(){'ok'} end あと、tosjisメソッドは入力文字列コード自動判定ですが、短い文字列だと判定が間違う可能性があるので、kconvメソッドで入力文字コードも指定した方がいいです。
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10358)
>継承して、新しいクラスMyCGIを作る方法ですが、できればCGIクラスそのものを改造したいです。 機能の追加じゃなくて機能を変えることになるので、新規クラスがいいと思いますが。 もとのクラスでやるとすると、cgi.rbの最後の方に書いてあるdef initialize(...) .... end を全部コピーして、その最後の部分に、@paramsの書き換えを追加するのでしょうか。 class CGI def initialize(type = "query") ここにオリジナルのコードをコピー @params = @params.each do|key,val| @params[key]=val.collect{|x|x.tosjis} end end end あるいは、paramsメソッドだけ書き換えればいいのであれば、 class CGI module QueryExtension def params w = {} @params.each{|k,v| w[k]=v.collect{|x| x.tosjis}} w end end end 毎回全部をコード変換するので、あまり良くないかな?フラグを設けて、初回だけ@paramsを書き換えるようなほうがいいでしょうね。 いずれにせよ、CGIクラスの機能を変更したい(orサブクラスを作りたい)のならば、cgi.rbを読まないとだめですよ。
お礼
notnotさん ご回答、ありがとうございます。 大変勉強になります。 >>機能の追加じゃなくて機能を変えることになるので、新規クラスがいいと思いますが。 先日notnotさんにご回答頂いた【ruby】クラスCGIを改造したい(http://oshiete1.goo.ne.jp/qa4944090.html)ですと、aliasを使って CGIクラスの機能を変えていたので、『あり』なのかと思ってましたが、今回の解法をみますと、一番最初のご回答がスッキリしてるように思います。 >>cgi.rbを読まないとだめですよ。 はい。
補足
notnotさん ご回答ありがとうございます。 #たびたびのご回答、ありがとうございます。 >def initialize(type = "query") のtype = "query"の意味がよくわかりませんでしたが、 def initialize()として動かしてみたところ、問題なく動作しました。 ご回答頂いた解法は、CGIクラスそのものを改造というより、CGIクラスを 継承して、新しいクラスMyCGIを作る方法ですが、できればCGIクラスそのものを改造したいです。 もしくは、新しいクラスを生成しないで、特異クラス定義でなんとかならないでしょうか? cgi=CGI.new class << cgi ここをどう書いたらよいか解らない。 end 上手く伝えられないのですが、『cgi=MyCGI.new』と記述する事になぜか 抵抗がありまして。。 良案ありましたら、よろしくお願いいたします。