2012-05-13 27 views
6

Powiedzmy mamy dwa zasoby:bloki nie widzę metod (środków szef kuchni)

template 'template1' do 
    owner 'root' 
    group 'root' 
end 

template 'template2' do 
    owner 'root' 
    group 'root' 
end 

Chciałbym ponowne wykorzystanie kodu wewnątrz zasobów. Jednak jeśli zdefiniuję proc w recepturze, otrzymasz NoMethodError dla owner, group itd. Dlaczego tak się dzieje? Zakres leksykalny nie jest inny, czyż nie? W rezultacie muszę użyć self.instance_eval &common_cfg.

common_cfg = Proc.new { 
    owner 'root' 
    group 'root' 
} 

template 'template1' do 
    common_cfg.call 
end 

template 'template2' do 
    common_cfg.call 
end 
+0

Czy błąd występuje, jeśli sprawiają, że globalny ('$ common_cfg')? –

+0

Zmienna proc jest oceniana poprawnie, ponieważ NoMethodError występuje w kontekście proc (właściciel, grupa itp.) – m33lky

+0

Oh; gotcha - usunie komentarz. –

Odpowiedz

2

powodu jak kucharz jest realizowany (z dużą ilością refleksji) trzeba umieścić go w bibliotece lub ruby ​​bloku zasobów, aby ją chronić. Myślę, że zasób ruby ​​będzie działał, ponieważ będzie poza zakresem.

http://wiki.opscode.com/display/chef/Libraries

zwykle z tego powodu idiom jest

["file_one","file_two"].each do |file| 
    template file do 
    owner "root" 
    group "root" 
    end 
end 
+0

Drugi link jest zepsuty. – Eye

+0

@Eye usunięto, ponieważ nie jest już istotne – EnabrenTane