Rails: named_scope, lambda and blocks
Ruby on-RailsRubyLambdaRuby on-Rails Problem Overview
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?
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
it's a parser problem. try this
named_scope :admin, (lambda do |company_id|
{:conditions => ['company_id = ?', company_id]}
end)
Solution 2 - Ruby on-Rails
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
Solution 3 - Ruby on-Rails
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.
Solution 4 - Ruby on-Rails
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!