Подтвердить что ты не робот

Rails: named_scope, лямбда и блоки

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

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

Любые идеи?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Здесь обсуждается SO обсуждение здесь

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

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

Ответ 3

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

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

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

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

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