52 votes

Rails : named_scope, lambda et blocs

Je pensais que les deux suivantes étaient équivalentes :

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 se plaint :

ArgumentError: tried to create Proc object without a block

Des idées ?

76voto

Martin DeMello Points 4811

C'est un problème d'analyseur syntaxique. essayez ceci

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

17voto

Mike Woodhouse Points 27748

Je pense que le problème peut être lié à la différence de préséance entre {...} y do...end

Il y a une discussion sur le SO aquí

Je pense que l'assignation d'un lambda à une variable (qui serait un Proc) pourrait se faire avec un do ... end :

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

10voto

Kelvin Points 5810

Si vous êtes sur ruby 1.9 ou plus récent 1 vous pouvez utiliser le littéral lambda (syntaxe de la flèche), qui a une priorité suffisamment élevée pour empêcher l'appel de méthode de "voler" le bloc du lambda.

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

1 La première version stable de Ruby 1.9.1 a été publiée le 30 janvier 2009.

7voto

khelll Points 12222

C'est quelque chose lié à la préséance comme je peux le 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!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X