Как я могу вызвать REXML::Элемент::add_attributes из рецепта шеф-повара?

#chef-infra #chef-recipe

#шеф-повар-инфра #шеф-рецепт

Вопрос:

У меня возникли некоторые проблемы с ‘chef ! = ruby’. У меня есть некоторый XML-код, который, кажется, отлично работает в irb и pry , но терпит неудачу в chef с помощью

 NoMethodError
-------------
undefined method `add_attribute'
  

ошибка.

 require "rexml/document"
::Chef::Recipe.send(:include, REXML) # can't `include REXML`
updates = Document.new(File.new updates_file)
options = updates.elements.each('application/component/option[@name="CHECK_NEEDED"]/@value') {|e| e}
unless options.empty?
  # Set existing <option /> Element
  element = options[0]
#  element.add_attribute("value", "false")
#  element.add_attribute( Attribute.new("value", "false") )
#  element.send("add_attribute", "value", "false")
  element.send("add_attribute", Attribute.new("value", "false"))
  

Как я могу заставить этот рецепт «скомпилироваться»?

Комментарии:

1. Есть ли какая-то конкретная причина, по которой вы хотите использовать этот код в рецепте вместо библиотеки? Кроме того, вы можете сослаться:- blog.chef.io/2013/09/04 /…

2. Итак, вы объединяете пространства имен с вероятным конфликтом имен методов, почему бы просто не использовать REXML::<метод> ? (и избегая вызова Recipe.send)

3. Ох, вздох. Проблема была на самом деле в updates.elements.each('application/component/option[@name="CHECK_NEEDED"]/@value') {|e| e} , который возвращал REXML::атрибут, а не REXML::элемент, который его содержит.