2009-09-25 10 views
50

Myślałem następujące dwa były równoważne:szyn: named_scope, lambda i bloki

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

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

ale Ruby narzeka:

ArgumentError: tried to create Proc object without a block 

pomysłów?

+0

Myślę, że chcesz albo lambda, albo blok, nie oba. W drugim przypadku po prostu pozbądź się lambda i podaj blok. To powinno zrobić to samo, co pierwsze. – jkupferman

Odpowiedz

74

to problem parser. spróbuj tego

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

Nie jestem pewien, czy to problem "parsera", ale twój kod powinien to naprawić. – khelll

+0

Wybrałem to jako moją odpowiedź, ponieważ pozwoliło mi to skończyć z moim ... końcowym ciastem. Dzięki, Martin. – Gav

+1

khelll: tak, "problem" jest trochę zniekształceniem, przyznam się. jest to kwestia niższego pierwszeństwa do ... końca, jak wyjaśnia stolarnia mike. –

17

Myślę, że problem może być związany z różnicą pierwszeństwa między {...} i do...end

Jest trochę SO dyskusja here

myślę przypisanie lambda do zmiennej (co byłoby Proc) mogłyby być wykonane z do ... end:

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

Dzięki Mike, spojrzał na inny wątek. :-) – Gav

7

jest to coś związane z pierwszeństwa mogę powiedzieć

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

Jeśli jesteś na Ruby 1.9 lub nowszy , można użyć lambda dosłowny (składnia strzałka), który ma wystarczająco wysokie pierwszeństwo, aby uniemożliwić wywołanie metody z "kradzieży" bloku z lambda.

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

1 Pierwszy stabilny Ruby 1.9.1 uwalnianie było 2009-01-30.