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。