Использование имя_класса в пользовательском генераторе Rails

#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