Задача 9-4: нет папки data c xml файлом

[Д] Дмитрий, 21 июля 2016, 19:51 , 3 подписчика

Нет папки data c xml файлом.

Во всех дочерних классах, в методе to_xml объявлена не работающая переменная disk

И я никак не могу понять, как у вас цена и остаток в xml файл попадают?

# А этот метод будет определён у родителя и доопределён у детей
  def to_xml
    res = REXML::Element.new('product')
    res.attributes["price"] = @price
    res.attributes["amount_available"] = @amount_available
    res
  end

А разве метод может быть доопределён? Он же вроде может быть переопределён? или он доопределяется за счёт super дочерних классов. Чего-то я запутался.

res = REXML::Element.new('product')

Выходит таким образом можно любые теги определять?

Обсуждение (7)


Michael Butlitsky Учитель

[M]

В родительском классе метод определен, в дочерних переопределен.

Но дочерние методы вызывают родительские с помощью ключевого слова super. Это и есть вызов родительского метода.

Пересмотри еще раз то место, где мы употребляем это ключевое слово.

Переменная disk действительно лишняя, можно и без нее обойтись.

Чтобы data/*.xml появилась, надо сперва запустить программу для наполнения библиотеки.


[Д]

Чтобы data/.xml* появилась, надо сперва запустить программу для наполнения библиотеки.

Я совсем запутался. Как он там может появиться, когда папки data и xml ффйла изначально нет. И может я чего не так понял, но вроде про создание папки а в ней xml файла, в проге ничего нет?

Я попробовал написать прогу, которая только добовляет товар.

Приложу zip. В xml файле есть результат. И вот здесь не пойму, как добиться того чтобы product — с ценой и остатком — попал в файл xml?

  • my_store.zip Мой вариант, записи продукта(ов) в магазин.

Michael Butlitsky Учитель

[M]

Попробуй сперва воспользоваться скриптом add_a_product.rb


Вадим Венедиктов Учитель

[В]

Дима абсолютно прав. Папку data, как и файл product.xml нужно создать предварительно. Перезалил программу.

За попадание нового товара в готовый файл data/product.xml отвечает метод save_to_xml(file_name) в файле product.rb. Там всё красноречиво прокомментировано.

Но дочерние методы вызывают родительские с помощью ключевого слова super. Это и есть вызов родительского метода.

Обрати также внимание, что метод to_xml у папы не только создаёт нужную ноду, но и возвращает её. А детский метод to_xml берёт то, что создал папа, докидывает туда нужные данные и возвращает это как своё творчество (return в последней строчке пропущен — мы уже большие, знаем, что в ruby он не нужен):

def to_xml
  product = super
  product.add_element( ... )
  product
end

[Д]

А можно на моем примере объяснить? Где я там недокодил) и как исправить? Так будет понятней. Сам всё же писал.)


Вадим Венедиктов Учитель

[В]

Ошибка в методе у дочерних классов.

Вы возвращаете не весь продукт, а только добавленный в него вложенный элемент:

product = super
product.add_element('book', {
  "title" => @title,
  "author_name" => @author_name
})

Сравните с моим кодом выше.


[Д]

Вот блин, забыл вернуть, ну конечно, а я всего "папу" перевернул думал в нем дело, нет чтобы "детишечек" проверить.)) В общем удалил конструктор,(он в моем случае бесполезен) исправил ошибку у дочерних классов(вернул product) и почему-то всё заработало!) Спасибо.