Rubyのブロックの記述方法にはdo...endと{...}の2種類があります。僕は基本的にRubyコーディング規約を参考にしてRubyコードを書いているのでdo...end派なのですが、Railsのnamed_scopeをこんな風に書いたらエラーがでました
named_scope :hoge, lambda do |name| { :conditions => ["name = ?", name] } end #=> ArgumentError "tried to create Proc object without a block"
でもこうしたらOK。
named_scope :hoge, lambda { |name| { :conditions => ["name = ?", name] } }
do...endと{...}って同じかと思っていましたが違うようです。リファレンスを読むと、結合強度が違うのだそう。
結合強度の違い
do...endだと、ブロックはfoobarメソッドへの引数になります。
foobar a, b do #... end
{...}だと、ブロックはbメソッドの引数となります。
foobar a, b {
#...
}
named_scopeをどうかくか
ということは、named_scopeをdo..endで書くには
named_scope(:hoge, lambda do |name| { :conditions => ["name = ?", name] } end)
のように括弧をつけて、ブロックがlambdaの引数であることを明らかにしてあげればいいのですね。でも見た目が汚いですね。named_scopeのときにはおとなしく{...}を使うようにしようと思います。