Rails: named_scope, lambda and blocks

Ruby on-RailsRubyLambda

Ruby 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!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGavView Question on Stackoverflow
Solution 1 - Ruby on-RailsMartin DeMelloView Answer on Stackoverflow
Solution 2 - Ruby on-RailsMike WoodhouseView Answer on Stackoverflow
Solution 3 - Ruby on-RailsKelvinView Answer on Stackoverflow
Solution 4 - Ruby on-RailskhelllView Answer on Stackoverflow