Je pensais que les deux suivants étaient équivalents:
named_scope :admin, lambda { |company_id| {:conditions => ['company_id = ?', company_id]} }
named_scope :admin, lambda do |company_id|
{:conditions => ['company_id = ?', company_id]}
end
mais Ruby est plaint:
ArgumentError: tried to create Proc object without a block
Des idées?
c'est un problème d'analyseur. essaye ça
named_scope :admin, (lambda do |company_id|
{:conditions => ['company_id = ?', company_id]}
end)
Je pense que le problème peut être lié à la différence de préséance entre {...}
et do...end
Il y a un peu SO Discussion ICI
Je pense que l'attribution d'une lambda à une variable (qui serait un proc) pourrait être effectuée avec un do ... end
:
my_proc = lambda do
puts "did it"
end
my_proc.call #=> did it
Si vous êtes sur Ruby 1.9 ou plus tard 1, vous pouvez utiliser la Lambda littéral (Syntaxe arrow), qui a une priorité suffisante pour empêcher l'appel de méthode de "voler" le bloc de la Lambda.
named_scope :admin, ->(company_id) do
{:conditions => ['company_id = ?', company_id]}
end
1 La première stable Ruby 1.9.1 La version 2009-01-30.
C'est quelque chose lié à la priorité que je peux dire
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!