web-dev-qa-db-fra.com

Rails: nommé_scope, lambda et blocs

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?

52
Gav

c'est un problème d'analyseur. essaye ça

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

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
17
Mike Woodhouse

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.

9
Kelvin

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!
7
khelll