自社サービスで二つのスマフォ用webアプリでsession共有して行き来している時にdump
format errorとなって落ちることがあった。
一度発生すると、F5押してもずっとdump format error。
原因はsessionにあることまでは色々なサイトを見ているうちにわかったんだけど、どこもブラウザのクッキー削除とかの解決方法しかなかった。
原因を追っていたら、うちの場合はmemcache-clientでデータをマーシャルロードしている時に落ちていることがわかった。
んで、ロードする前のデータ見てたらflashの文字が見えたので、flashを使わなくしたらなんか解決したっぽい。
なんか煮えきらない日記ですが、誰か困ってたらやってみるといいかもしれないです。
rubyで自分がどう呼び出されているかを調べる
printstacktraceのようなもの。
callerと書けば、どこから呼ばれたのかがわかる。
本番環境でなんか2件データが出来る時があって、どうしても原因がわからないのでどこから呼ばれてるのか仕込んでみた。
1
2
3
4
5
6
7
| require 'logger'
logger = Logger.new('log/debug.log', 'daily')
logger.level = Logger::DEBUG
logger.info( "#####" + DateTime.now.strftime("%Y年%m月%d日 %H時%M分%S秒") + "#####")
logger.info(self.inspect)
logger.info(caller.join(" n"))
logger.info( "############")
|
ログは一日置きにローテートさせてみた。
もう一週間ぐらいたつけど、罠しかけた途端現象が起きなくなるという。
yieldするメソッドの引数とblockに引数とかあると混乱するのでメモっとく。
1
2
3
4
5
6
7
8
| def hoge(hoge)
p hoge
yield("bar")
end
hoge("hoge"){|bar| p bar}
# "hoge"
# "bar"
|
好きです。Array.wrap
ActiveSupportでArrayクラスで定義されてます。
1
2
| Array.wrap("hoge") #=> ["hoge"]
Array.wrap(["hoge"]) #=> ["hoge"]
|
うんうん。いい。
下のコードは適当に書いたので動かんかったらごめんなさい。
1
2
3
4
| class User < ActiveRecord::Base
has_one :lover
has_many :friends
end
|
ってモデルがあったら
1
2
3
4
5
6
7
8
9
10
| def print_relations(lover_or_friends)
if lover_or_friends.instance_of?(Lover)
p lover_or_friends
else
lover_or_friends.each do |lover_or_friend|
p lover_or_friend
end
end
end
|
って、いちいち判定せずに。
1
2
3
4
5
| def print_relations(lover_or_friends)
Array.wrap(lover_or_friends).each do |lover_or_friend|
p lover_or_friend
end
end
|
って、いっそArrayにしてしまって、回すとスッキリ
通常使ってたらあんまりないのかもしれないけど。
libとかでxxx _path(rake routesで一番左にでるやつ)のurlを取りたいとき。
1
| Rails.application.routes.url_helpers.xxx_path(@user)
|
で取れる。
1
| Rails.application.routes.url_helpers.user_register_shop_staffs_path(shop) # => "/shops/1/staffs/user_register"
|
軽くはまった。
rails 3.0.5
jpmobile 1.0.0
最初にアクセスしたコントローラで、flashを設定しつつredirect _toしたらflashから値が取り出せなかった。
flashはsession使っているから、初回のみsession作ってあげる必要があったみたい。
個数分受けとればいい。
勝手に展開してくれる。
1
2
| array = [["1a","1b"],["2a","2b"]]
array.map{|a1,a2| a1 + a2} # => ["1a1b", "2a2b"]
|
injectとかと併用する場合は括弧で囲う。
以下は連想配列に変換する例
1
2
| array = [["1a","1b"],["2a","2b"]]
array.inject(Hash.new){|hash,(param1,param2)| hash[(param1)] = param2; hash } # => {"1a"=>"1b", "2a"=>"2b"}
|
いいですね。Happyになりますね。