次の2つは同等であると思いました。
named_scope :admin, lambda { |company_id| {:conditions => ['company_id = ?', company_id]} }
named_scope :admin, lambda do |company_id|
{:conditions => ['company_id = ?', company_id]}
end
しかしRubyは不平を言っています:
ArgumentError: tried to create Proc object without a block
何か案は?
それはパーサーの問題です。これを試して
named_scope :admin, (lambda do |company_id|
{:conditions => ['company_id = ?', company_id]}
end)
問題は{...}
とdo...end
の優先順位の違いに関連していると思います
いくつかありますSO議論 ここ
ラムダを変数(Procになる)に割り当てると思いますcouldはdo ... end
で実行します。
my_proc = lambda do
puts "did it"
end
my_proc.call #=> did it
Ruby 1.9以降を使用している場合 1、ラムダリテラル(矢印構文)を使用できます。これは、メソッド呼び出しがラムダからブロックを「盗む」のを防ぐのに十分な優先順位を持っています。
named_scope :admin, ->(company_id) do
{:conditions => ['company_id = ?', company_id]}
end
1最初の安定版Ruby 1.9.1リリースは2009-01-30でした。
私が知ることができるように、それは優先順位に関連するものです
1.upto 3 do # No parentheses, block delimited with do/end
|x| puts x
end
1.upto 3 {|x| puts x } # Syntax Error: trying to pass a block to 3!