Rails:named_scope,lambda和blocks

我认为以下两个是相同的:

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 

有任何想法吗?

这是一个parsing器问题。 尝试这个

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

我认为这个问题可能与{...}do...end之间的优先级区别有关

这里有一些讨论

我认为分配一个lambda到一个variables(这将是一个Proc) 可以完成一个do ... end

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

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

 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! 

如果您使用的是Ruby 1.9或更高版本1 ,则可以使用具有足够高优先级的lambda文字(箭头语法)来防止方法调用从“lambda”中“窃取”该块。

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

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