« RubyでCGI(ロギング編) | トップページ | script.aculo.usのEffectを止める »

2007年6月17日 (日)

RubyでCGI(セッション編)

RubyでCGI(セッション編)です。

えーと、相変わらず目的はショッピングカートの実現なんですが・・

ていうか、(全部AJAXでやるので)HTML的には2画面しかない
ショップにしようとしているのでセッションなんか使わずに
hiddenでとばしちゃえばいいじゃんとも思うんですが、
まあ、そこはそれ

今回のサイト構築の目的のひとつは、

 Ruby CGIをいちから学習~

なわけで、

 「ショッピングカートをつくるなら、
  セッション使うの!」
 「使うことに意義があるの!」
 「いいの!」

以上なわけです。はい。

で、作ったのが以下。

◆AJAX用買い物かごCGI basket.cgi ◆

#!/usr/local/bin/ruby -Ku
#----------------------------------------------------------
# 買い物かごCGI
# セッション上に複数の商品を持つ
# ・現在「買物かご」に入っている商品一覧を返す
# ・「買物かご」に商品を追加する
# ・「買物かご」を空にする
# ・「買物かご」から商品を戻す
#----------------------------------------------------------
require "cgi"
require "cgi/session"
require "./basket.rb"
require "logger"

log= Logger.new('app.log')
log.level=Logger::INFO
cgi = CGI.new
session = CGI::Session.new(cgi)
basket = Basket.new(session)

log.info(basket.inspect)
if cgi.include?("add")
    basket.add(cgi["add"])
end
if cgi.include?("clear")
    basket.clear
end
if cgi.include?("remove")
    basket.remove(cgi["remove"])
end

print cgi.header({"charset" => "utf-8"})
print basket.to_json

◆basket.rb◆


#!/usr/local/bin/ruby -Ku
# 買い物かご
require "./to_json.rb"
require "logger"

class Basket
    @@log = Logger.new('app.log')
    @@log.level = Logger::INFO

    def initialize(session)
        @session = session
        ret = @session['basket']
        @@log.info(ret)
        if (ret == nil)
            ret = "{}"
            @session['basket']= ret
        end
        @content = eval(ret)
    end

    def add(itemId)
        count = @content[itemId]
        if (count == nil )
            count = 0
        end
        count+=1
        @content.store(itemId, count)
        @session['basket']=@content.inspect
    end

    def remove(itemId)
        count = @content[itemId]
        if (count == nil || count < 1)
            return
        end
        count-=1
        @content.store(itemId, count)
        if (count == 0)
            @content.delete(itemId)
        end
        @session['basket']=@content.inspect
    end

    def clear
        @content.clear
        @session['basket']=@content.inspect
    end

    def to_json
        return @content.to_json
    end
end

いやー、ハズカシイィ;;
Ruby初心者のくせにソース大公開;;

まあ、いいさ、どうせ誰もみちゃいない。
俺様の俺様による俺様のための日記ブログさw

昨日2時間ほど悩みまくって、
 ・ローカルアパッチだのロギングだのしないとだめだー、
 ・めんどいけど、やるかー
とまで思わせた躓きポイントは、Ruby の sessionを
J2EEのセッションと同じように考えてしまっていたこと。

Javaのセッションだと、


Map inMap = new HashMap();
session.setAttribute("someAttr", inMap);
inMap.put("tsuu", "kaa");


Map outMap = (Map)session.getAttribute("someAttr");
out.println(outMap.get("tsuu"));


なんて書くと、"kaa"が帰ってくるわけです。
つまり、setAttributeは「参照渡し」なので、
セットしたあとでリストに要素追加すると、
セッションに紐づいたリストに要素が追加されるということで、
あとで取り出したときには"hoge"ってのが入ってるので
取り出したリストの大きさは1になる

しかしRubyのセッション(CGI::Session)はファイルに書き出すという
実装だからというか、Rubyのハッシュってものがそうなのだと思うけど(未確認)
「実体渡し」なので、


inHash = Hash.new
session['someAttr'] = inHash
inHash['tsuu'] = 'kaa'


outHash =session['someAttr'];
out.println(outHash['tsuu']);


とかいても、'kaa'って帰ってこないでnilが帰ってくる。
 (たぶん。 実際に検証したのは、
  上に書いた買い物かごクラスなので、
  動かなかったときは、
  メソッドが定義されてねぇって
  おこられちゃって悩みますたよ。)

あと、もうひとつ、躓いたポイントは、
ハッシュにハッシュって詰められる?ってこと。
先ほどのソースでは、

        @content = eval(ret)
とか
        @session['basket']=@content.inspect
とか
苦し紛れに書いているのはそのため。

ひょっとして、Rubyってハッシュにハッシュつめられない?
いや、そんなことないか。。(未確認)

少なくともSessionにハッシュをつめたとき、
あとで取り出すと、なんかおかしなことになってるんだよねぇ。

{"1"=>1}ってのつめたら、取り出すと"11"になってる

だから、文字列化してつめて、取り出したらevalしてると。
eval, eval ,, なんか危険な感じでいやーん。です。
自分でつめたものevalしてるだけだから大丈夫かなぁ。

なぞです。

が、まあいいや、とにかく、ものつくりながら
覚えてゆこうかと思いますです。

それではまた次回。

« RubyでCGI(ロギング編) | トップページ | script.aculo.usのEffectを止める »

パソコン・インターネット」カテゴリの記事

コメント

まだ良くわかっていないが、おそらく、
・RubyのHashは参照渡しだが、
・でもsessionはオブジェクトをmarshal化して
 保存する関係上、実体が保存される
それと
・HashにHashはぜんぜんつめられる
そんな感じっぽい。

でも、何で、{"1"=>"1"}というHashをmarshal化してそれを取り出すと"11"になっちゃうかは不明だなぁ。


コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/34023/15462356

この記事へのトラックバック一覧です: RubyでCGI(セッション編):

« RubyでCGI(ロギング編) | トップページ | script.aculo.usのEffectを止める »

Haruya's Violin

2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

最近のトラックバック

無料ブログはココログ