文字列に二つ以上の同一指定文字が使われているかどうか?

1
2
3
4
5
6
str = "@123@56"

str.index("@") #=> 0
str.rindex("@") #=>4

str.index("@") != str.rindex("@")

左からと右からの指定文字の位置を調べて違ってたら、同じ文字が二回使われているねというだけのロジック。

僕は文系ロジックと勝手に命名しているロジックがあります。
どういったのが文系ロジック?と聞かれると困りますが。なんかにおいです。
上記は文系ロジックっぽいかなと思うのですが。どうでしょうか?


リクエストメソッドを取得

コントローラでget post put deleteを識別する方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# getかどうか
request.get?

# postかどうか
request.post?

# putかどうか
request.put?

# deleteかどうか
request.delete?

# 文字列で判定
request.request_method == "get"

#シンボルで
request.request_method_symbol == :get


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