2009-09-25 10 views
50

je pensais que les deux suivantes étaient équivalentes:Rails: named_scope, lambda et blocs

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 

Toutes les idées?

+0

Je pense que vous voulez soit un lambda ou un bloc, pas les deux. Donc, dans le second cas, il suffit de se débarrasser du lambda et passer dans un bloc. Cela devrait faire la même chose que le premier. – jkupferman

Répondre

74

c'est un problème de l'analyseur. essayez cette

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

Je ne suis pas sûr que ce soit un 'problème de parseur', mais votre code devrait le réparer. – khelll

+0

Choisissez ceci comme ma réponse car cela m'a permis de faire mon ... faire un gâteau. Merci Martin. – Gav

+1

khelll: ouais, 'problème' est un peu une fausse déclaration, je l'admets. c'est une question de priorité inférieure de do ... end, comme l'explique mike woodhouse. –

17

Je pense que le problème peut être lié à la différence de priorité entre {...} et do...end

Il y a quelques SO discussion here

Je pense que l'attribution d'un lambda à une variable (ce qui serait un Proc) pourrait être fait avec un do ... end:

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

Merci Mike, jeta un oeil à l'autre fil. :-) – Gav

7

Il 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! 
6

Si vous êtes sur Ruby 1.9 ou plus , vous pouvez utiliser le lambda littéral (syntaxe flèche), qui a une préséance suffisante 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 Ruby 1.9.1 stable est 30.01.2009.

Questions connexes