7

我对构建 Ruby gems 很陌生,并且正在尝试我的第一个。我正在为我的 gem 编写一个生成器,它将在我的 Rails 应用程序中生成一个迁移。我希望简单地将 gem 包含在 Rails 应用程序中,运行“rails g mygem:install”让它创建迁移,然后运行“rake db:migrate”完成所有操作。

我找到了几种不同的方法来完成类似的任务,但到目前为止没有任何效果。我似乎无法让 Rails 应用程序找到生成器。我尝试过的最新指南位于:http ://www.railsdispatch.com/posts/how-rails-3-enables-more-choices-part-1 。

这是我当前的宝石结构的样子:

-lib/
  -generators/
    -templates/
      -some_migration.rb
    -install_generator.rb
  -gemname/
    -rails/
      -railtie.rb
      -engine.rb
      -tasks/
        -gemname.rake
  -gemname.rb
 -spec/
 -gemname.gemspec

这是我的 install_generator.rb 文件的样子:

require 'rails'

module Gemname
  class InstallGenerator < ::Rails::Generators::Base
    include Rails::Generators::Migration
    source_root File.expand_path('../templates', __FILE__)

    desc "add the migrations"
    def self.next_migration_number(path)
      unless @prev_migration_nr
        @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
      else
        @prev_migration_nr += 1
      end
     @prev_migration_nr.to_s
    end

    def copy_migrations
     migration_template "some_migration.rb", "db/migrate/some_migration.rb"
    end
  end
end

我不确定我是否缺少某些东西。我正在使用 Rails 3.2 应用程序进行测试,该应用程序的 Gemfile 中列出了我的 gem,并且 gem 已安装。gem 文件夹结构有什么问题可能会阻止我的生成器出现吗?我需要在某处要求什么吗?

任何帮助表示赞赏。

4

2 回答 2

1

好吧,我不确定我所做的哪些更改解决了我的问题,但这是我所做的:

将生成器的名称更改为 gemname_generator.rb 并将生成器的目录结构更改为:

- lib/
  -generators/
    -templates/
    -gemname_generator.rb

将此行添加到我的生成器中:

namespace 'gemname'

我现在可以在我的 Rails 应用程序中运行“rails g gemname”并让它调用我的生成器。

于 2012-11-29T14:40:47.900 回答
1

默认情况下,Rails 不再像以前那样自动加载 lib 中的所有内容。对于需要文件的一些方法,请查看此问题的答案 - Best way to load module/class from lib folder in Rails 3? .

于 2012-11-29T08:38:43.790 回答