2017-02-16 16 views
1

у меня есть рецепт, который петли через кучу данных, определенных в атрибутах:Как разделить код между рецептами

node["repos"].each do |repo, data| 
    ...do stuff... 
end 

секция ...do stuff... довольно долго, и я хотел бы повторно использовать его в нескольких рецепты, с той лишь разницей, что данные, установленные в атрибутах, различны.

Я попытался двигаться внутри цикла к другому рецепту, и в том числе это так:

node["repos"].each do |repo, data| 
    include_recipe "other_recipe" 
end 

Но когда он пытался бежать other_recipe, переменная data не существует.

Что такое «правильный» способ обмена кодами между рецептами?

ответ

3

Простейшей вещью было бы перемещение этого do stuff в библиотеку.

my_cookbook/библиотеки/myhelper.rb:

module Myhelper 
    def do_stuff(repo, data) 
    [...you can use all kinds of resources here as in recipe...] 
    end 
end 

Затем вы можете использовать этот модуль в рецептах, как, что:

another_cookbook/рецепты/some_recipe.rb:

extend Myhelper 
do_stuff(node[:attribute1], node[:attribute2]) 

Просто убедитесь, что вы добавили зависимость от my_cookbook в метаданных:

another_cookbook/metadata.rb:

depends 'my_cookbook' 
+0

Такого рода вещи могут быть работоспособным, но это очень продвинутая техника, и я бы не рекомендовал его новым пользователям из ворот :) много как это может пойти не так с минимальной обратной связью, поскольку вы в основном обходите самого шеф-повара и используете его как API-интерфейс Ruby. – coderanger

+0

Создание настраиваемого ресурса требует еще больших проблем. –

+0

Добавление этой строки в 'metadata.rb' только для того, если вы хотите использовать эту библиотеку из другой кулинарной книги, правильно? Если я хочу использовать его в нескольких рецептах в одной и той же кулинарной книге, я предполагаю, что мне это не понадобится. – PortMan

1

К сожалению, это не сработает, потому что include_recipe оба не позволяют передавать параметры и «дебютируют», что означает, что он работает только один раз для данного рецепта.

Простейший вариант в эти дни для такого рода вещей заключается в создании пользовательского ресурса. Другие варианты включают определения и вспомогательные методы, но я бы начал с пользовательского ресурса и пошел оттуда. Входы в блок материала (repo и data в этом случае) становятся ресурсными свойствами, а кусок кода рецепта идет в методе действия ресурса.