Рельсы: именованный объем, лямбда и блоки
Я думал, что следующие два были эквивалентны:
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 ответа:
это проблема парсера. попробуйте это
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.