如何在Rails生成器中使用Thor :: Shell :: Basic?

时间:2012-12-03 00:00:06

标签: ruby-on-rails ruby thor

我正在编写Rails 3.2生成器,并希望使用Thor::Shell::Basic实例方法(例如askyes?),就像它们在official Rails guides on Application Templates中一样。

module MyNamespace
  class ScaffoldGenerator < Rails::Generators::Base
    source_root File.expand_path('../templates', __FILE__)

    if yes? "Install MyGem?"
      gem 'my_gem'
    end

    run 'bundle install'
  end
end

这会给我一个NoMethodError: undefined method 'yes?' for MyNamespace::ScaffoldGenerator:Class

我无法弄清楚如何使这些实例方法可用 - 我已经从Rails::Generators::Base继承。

编辑:

啊,它可能与Thor无关......我收到警告:

[WARNING] Could not load generator "generators/my_namespace/scaffold/scaffold_generator"

虽然我使用生成器来生成生成器但是没有正确设置...

1 个答案:

答案 0 :(得分:2)

哦,是的,它必须与Thor做点什么。

不要让自己因警告而感到困惑。你知道Rails :: Generators使用Thor,所以请转到the Thor Wiki并查看how Thor tasks work

rails生成器执行将调用生成器中的任何方法。因此,请确保将您的内容组织成方法:

module MyNamespace
  class ScaffoldGenerator < Rails::Generators::Base
    source_root File.expand_path('../templates', __FILE__)

    def install_my_gem
      if yes? "Install MyGem?"
        gem 'my_gem'
      end
    end

    def bundle
      run 'bundle install'
    end
  end
end

务必将您的发电机放入正确的文件夹结构,例如lib/generators/my_namespace/scaffold_generator.rb

感谢您提出问题,伙计!