#ruby-on-rails #ruby-on-rails-5 #thor #rails-generators
#ruby-on-rails #ruby-on-rails-5 #тор #rails-генераторы
Вопрос:
У меня есть базовый пользовательский генератор, который выглядит следующим образом, который наследуется от Rails:: Generators::NamedBase в приложении Rails 5.1
class NotificationGenerator < Rails::Generators::NamedBase
source_root File.expand_path('../templates', __FILE__)
def notification
copy_file "notification.rb", "app/notifications/#{file_name}.rb"
copy_file "notification_spec.rb", "spec/notifications/#{file_name}_spec.rb"
end
end
Мой файл шаблона вызывается notification.rb.tt который находится в каталоге ../ templates.
Шаблон выглядит следующим образом:
class <%= class_name %> < Notification
def to_mail
end
def to_sms
end
end
Однако, когда я запускаю генератор, созданные файлы имеют <%= class_name %> в файле, а не результат вызова этого метода. Как мне заставить генератор фактически отображаться как шаблон erb?
Комментарии:
1. Вам нужно было бы проанализировать файл через
ERB
2. Как бы я это сделал?
Ответ №1:
После изучения некоторых коммитов Rails core я обнаружил эту проблему, в которой немного обсуждается расширение файла.
Похоже, что в rails 5.2 все шаблоны были переименованы в .tt (что означает, что приведенный выше код мог бы сработать, если бы я обновился, я не углублялся так глубоко в ядро rails).
Однако в качестве исправления для моего личного использования в 5.1 последний комментарий рафаэля Франки раскрывает решение. Если я использую ‘template’ вместо copy_file, он анализирует и выводит правильно.
Рабочий генератор выглядит следующим образом:
class NotificationGenerator < Rails::Generators::NamedBase
source_root File.expand_path('../templates', __FILE__)
def notification
template "notification.rb", "app/notifications/#{file_name}.rb"
template "notification_spec.rb", "spec/notifications/#{file_name}_spec.rb"
end
end