web-dev-qa-db-ja.com

Rails:named_scope、lambda、blocks

次の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

何か案は?

52
Gav

それはパーサーの問題です。これを試して

named_scope :admin, (lambda do |company_id| 
  {:conditions => ['company_id = ?', company_id]}
end)
76
Martin DeMello

問題は{...}do...endの優先順位の違いに関連していると思います

いくつかありますSO議論 ここ

ラムダを変数(Procになる)に割り当てると思いますcoulddo ... endで実行します。

my_proc = lambda do 
  puts "did it"
end
my_proc.call #=> did it
17
Mike Woodhouse

Ruby 1.9以降を使用している場合 1、ラムダリテラル(矢印構文)を使用できます。これは、メソッド呼び出しがラムダからブロックを「盗む」のを防ぐのに十分な優先順位を持っています。

named_scope :admin, ->(company_id) do 
  {:conditions => ['company_id = ?', company_id]}
end

1最初の安定版Ruby 1.9.1リリースは2009-01-30でした。

9
Kelvin

私が知ることができるように、それは優先順位に関連するものです

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!
7
khelll