2013-09-24 110 views
8

Có nhiều cách để kiểm tra sự tồn tại của một thuộc tính lồng nhau trong bếp, và tôi không chắc chắn đó là đúng/tốt nhất, và nếu có sẽ dẫn đến các thuộc tính có sản phẩm nào được lưu trữ trên các nút:Cách chính xác để kiểm tra sự tồn tại của thuộc tính lồng nhau trong Chef là gì?

node[:parent] and node[:parent][:child] 

node.attribute?(:parent) and node[:parent].attribute?(:child)) 

node[:parent].nil? and node[:parent][:child].nil? 

Nó muốn được rất nhiều ưu tiên để có thể kiểm tra cho phụ huynh và trẻ em cùng một lúc, nhưng tôi không biết nếu đó là có thể. Tôi đang sử dụng Chef 10, không phải Chef 11, mặc dù câu trả lời giải thích hoặc là được chào đón.

Trả lời

11

Đối tượng thuộc tính nút là HashMap. Bạn có thể sử dụng API gốc ruby ​​để tra cứu các thuộc tính lồng nhau.

Chef Node Object cung cấp một số phương pháp helper như:

node.attribute?() 
node[:foo].attribute?(:bar) 
node[:foo].member?(:bar) 

Ngoài ra còn có một phương pháp mới node.debug_value() trong bếp 11 để giúp bạn thuộc tính nút debug mà cũng rất hữu ích:

node.debug_value(:foo, :bar) 

Bạn có thể tìm thấy chi tiết từ bài viết Chef 11 In-Depth: Attributes Changes

2

Kiểm tra sách nấu ăn nấu ăn bằng đầu bếp deep_fetch tiện ích mở rộng thấp cho các tham chiếu an toàn đến các thuộc tính sâu.

4

Cách tôi đã giải quyết vấn đề này gần đây hơn là luôn đặt giá trị mặc định cho các thuộc tính được sử dụng trong sách dạy nấu ăn nếu có thể.

Ví dụ, cookbook/attributes/default.rb sẽ chứa:

default[:parent][:child] = nil 

Và trong công thức, bất kỳ kiểm cho các giá trị thuộc tính có thể được giảm xuống còn:

node[:parent][:child].nil? 

Tất nhiên, nó thường là xa hữu ích hơn để có giá trị mặc định có thể sử dụng và không phải kiểm tra.