Как Вы делаете генератор, который изменяет файл.
Я пытаюсь сделать его так, чтобы это нашло шаблон в файле и добавило, прибывают содержание в строку ниже его.
Генератор строительных лесов Rails делает это, когда добавляет маршрут в config/routes.rb
Он делает это, вызывая очень простой метод:
def gsub_file(relative_destination, regexp, *args, &block)
path = destination_path(relative_destination)
content = File.read(path).gsub(regexp, *args, &block)
File.open(path, 'wb') { |file| file.write(content) }
end
Что он делает, так это принимает путь/файл в качестве первого аргумента, за которым следует обратный шаблон, аргументы gsub и блок. Это защищенный метод, который вам придется воссоздать для использования. Я не уверен, что destination_path
- это что-то, к чему у вас будет доступ, так что вы, вероятно, захотите пройти по точному пути и пропустить любое преобразование.
Чтобы использовать gsub_file
, допустим, вы хотите добавить теги к вашей пользовательской модели. Вот как это сделать:
line = "class User < ActiveRecord::Base"
gsub_file 'app/models/user.rb', /(#{Regexp.escape(line)})/mi do |match|
"#{match}\n has_many :tags\n"
end
Вы находите определенную строку в файле, открыватель класса, и добавляете свою строку has_many
прямо под ней.
Остерегайтесь, потому что это самый хрупкий способ добавления содержимого, поэтому маршрутизация - одно из немногих мест, где оно используется. Пример выше обычно обрабатывается с помощью mix-in.