Rails:named_scope,lambda和blocks

时间:2009-09-25 11:04:40

标签: ruby-on-rails ruby lambda

我认为以下两个是等价的:

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

有什么想法吗?

4 个答案:

答案 0 :(得分:76)

这是一个解析器问题。试试这个

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

答案 1 :(得分:17)

我认为问题可能与{...}do...end

之间的优先级差异有关

有一些SO讨论here

我认为将一个lambda分配给一个变量(可能是一个Proc)可以用do ... end来完成

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

答案 2 :(得分:9)

如果您使用的是ruby 1.9或更高版本 1 ,则可以使用lambda文字(箭头语法),该文字具有足够高的优先级,以防止方法调用来自"窃听& #34;来自lambda的块。

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

1第一个稳定的Ruby 1.9.1版本是2009-01-30。

答案 3 :(得分:7)

这是我可以告诉的优先顺序

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!