Rails: named_scope, lambda and blocks

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

I thought the following two were equivalent:

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

but Ruby is complaining:

ArgumentError: tried to create Proc object without a block 

Any ideas?

回答1:

it's a parser problem. try this

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


回答2:

I think the problem may be related to the difference in precedence between {...} and do...end

There's some SO discussion here

I think assigning a lambda to a variable (which would be a Proc) could be done with a do ... end:

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


回答3:

It's something related to precedence as I can tell

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! 


回答4:

If you're on ruby 1.9 or later 1, you can use the lambda literal (arrow syntax), which has high enough precedence to prevent the method call from "stealing" the block from the lambda.

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

1 The first stable Ruby 1.9.1 release was 2009-01-30.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!