Ответ 1
это проблема парсера. попробуйте это
named_scope :admin, (lambda do |company_id|
{:conditions => ['company_id = ?', company_id]}
end)
Я думал, что следующие два эквивалентны:
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
Любые идеи?
это проблема парсера. попробуйте это
named_scope :admin, (lambda do |company_id|
{:conditions => ['company_id = ?', company_id]}
end)
Я думаю, что проблема может быть связана с различием в приоритете между {...}
и do...end
Здесь обсуждается SO обсуждение здесь
Я думаю, что назначение lambda для переменной (которая была бы Proc) может быть выполнена с помощью do
... end
:
my_proc = lambda do
puts "did it"
end
my_proc.call #=> did it
Это что-то связано с приоритетом, как я могу сказать
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!
Если вы используете ruby 1.9 или новее 1 вы можете использовать лямбда-литерал (синтаксис стрелок), который имеет достаточно высокий приоритет, чтобы предотвратить вызов метода из "кражи" блока из лямбда.
named_scope :admin, ->(company_id) do
{:conditions => ['company_id = ?', company_id]}
end
1 Первый стабильный выпуск Ruby 1.9.1 был 2009-01-30.