在自定义的Rails生成器中使用class_name

时间:2019-03-18 02:51:29

标签: ruby-on-rails ruby-on-rails-5 thor rails-generators

我有一个基本的自定义生成器,它看起来像这样,它继承自Rails 5.1应用程序中的Rails :: Generators :: NamedBase

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 个答案:

答案 0 :(得分:0)

在深入研究了一些Rails核心提交之后,我发现this issue稍微讨论了文件扩展名。

在Rails 5.2中,似乎所有模板都重命名为.tt(这意味着如果我要升级,上面的代码可能会起作用,而我并没有深入Rails核心)。

不过,作为我自己在5.1上个人使用的修复程序,rafaelfranca的最后评论提出了一个解决方案。如果我使用“模板”而不是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