dump format error

自社サービスで二つのスマフォ用webアプリでsession共有して行き来している時にdump format errorとなって落ちることがあった。
一度発生すると、F5押してもずっとdump format error。

原因はsessionにあることまでは色々なサイトを見ているうちにわかったんだけど、どこもブラウザのクッキー削除とかの解決方法しかなかった。

原因を追っていたら、うちの場合はmemcache-clientでデータをマーシャルロードしている時に落ちていることがわかった。
んで、ロードする前のデータ見てたらflashの文字が見えたので、flashを使わなくしたらなんか解決したっぽい。

なんか煮えきらない日記ですが、誰か困ってたらやってみるといいかもしれないです。


someone call me

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( "############")

ログは一日置きにローテートさせてみた。
もう一週間ぐらいたつけど、罠しかけた途端現象が起きなくなるという。


if文でメソッド定義したりしなかったり

表題の通り

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def hoge
  p "hoge"
end if true

hoge # => "hoge"

def bar
  p "bar"
end if false

bar # => NameError: undefined local variable or method `bar' for main:Object

def hogefuga
 puts hoge + "fuga"
end if respond_to?(hoge)

hogefuga # => # hogefuga


いっつも忘れるsanitizeメソッド

完全備忘録
除去したくないタグを第2引数に指定

rails c

で起動した体で

1
2
ApplicationController.helpers.sanitize "<div>4文字以上で入力ください<br />入力された文字は2文字です", :tags => %(br)
# => "4文字以上で入力ください<br />入力された文字は2文字です" 

メソッドに引数。yieldにも引数

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が便利な件

好きです。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にしてしまって、回すとスッキリ


xxx_pathからurlを取りたい

通常使ってたらあんまりないのかもしれないけど。

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"

jpmobileでredirect_toした時にflashが取得できない

軽くはまった。

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になりますね。