なんとなく日々徒然と

いっつも忘れる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になりますね。

each_with_indexの開始を任意の数値から

each _with _indexは0始まりでインデックスが使える。

1
["a","b"].each_with_index{|elem,i| puts i} #=> 0 1

でも連番降ったりとか1始まりが欲しい場合がある。
そんな場合。

1
["a","b"].each.with_index(1){|elem,i| puts i} #=> 1 2

もちろん数値変えればスタートの値も変わる。

rails console

rails consoleで

1
ActiveRecord::Base.logger = Logger.new(STDOUT)

って書くとSQLが吐かれるようになります。

1
2
User.first
User Load (0.1ms)  SELECT `users`.* FROM `users` WHERE (users.deleted_at IS NULL) LIMIT 1

2012年4月2日追記。

whereつけると戻り値がrelationになるから、to _sqlが使える。
scoped使うとrelation取れる。

1
User.unscoped.to_sql #=> "SELECT `users`.* FROM `users`"