Рельсы: именованный объем, лямбда и блоки


Я думал, что следующие два были эквивалентны:

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

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

но Руби жалуется:

ArgumentError: tried to create Proc object without a block

какие идеи?

4 51

4 ответа:

это проблема парсера. попробуйте это

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

Я думаю, что проблема может быть связана с разницей в приоритете между {...} и do...end

есть некоторые так обсуждение здесь

Я думаю, что присвоение лямбда переменной (которая будет Proc)может С do ... end:

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

Если вы находитесь на ruby 1.9 или более поздней версии 1, вы можете использовать лямбда-литерал (синтаксис стрелки), который имеет достаточно высокий приоритет, чтобы предотвратить вызов метода от "кражи" блока из лямбда.

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

1 первый стабильный выпуск Ruby 1.9.1 был 2009-01-30.

Это что-то связанное с приоритетом, как я могу сказать

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!