首页 > 解决方案 > 如何将我的 rails 自定义生成器连接到模型一?

问题描述

目前,我创建了一个独立的生成器。当我运行时rails g query,它可以正常工作并很好地创建我的文件。

这里的代码:

# lib/generators/rails/query_generator.rb

require_relative '../my_lib/named_base'

module Rails
  module Generators
    class QueryGenerator < MyLib::Generators::NamedBase
      source_root File.expand_path('templates', __dir__)

      check_class_collision suffix: 'Query'

      def create_model_query
        return if class_name.blank?

        template_file = File.join('app/queries', class_path, "#{file_name}_query.rb")
        template 'query.rb.erb', template_file
      end
    end
  end
end

现在,我想在人们运行时运行生成器,rails g model但我无法实现。我尝试覆盖生成器模型类并使用 ahook_for来调用它,但它不起作用。这里的代码:

# lib/generators/rails/model_generator.rb

require "rails/generators"
require "rails/generators/rails/model/model_generator"
require_relative './query_generator'

module Rails
  module Generators
    class ModelGenerator < ::Rails::Generators::ModelGenerator
      hook_for :orm, as: :model, in: :rails do |instance, model|
        instance.invoke Rails::Generators::QueryGenerator, [ instance.name ]
      end
    end
  end
end

我希望你能帮助我。谢谢!

标签: ruby-on-railsrubyactiverecordrails-generators

解决方案


最后,我找到了解决方案!在Railtie的帮助下,我可以实现从 rails 模型生成器挂钩的预期行为。

# lib/my_gem.rb
require ...
require 'my_gem/railtie' if defined?(Rails)
 
# lib/my_gem/railtie.rb

require 'rails/railtie'

module ActiveModel
  class Railtie < Rails::Railtie
    generators do |app|
      Rails::Generators.configure! app.config.generators
      require_relative '../generators/model_generator'
    end
  end
end

# lib/generators/model_generator.rb

require 'rails/generators'
require 'rails/generators/rails/model/model_generator'
require_relative 'rails/query_generator'

module Rails
  module Generators
    class ModelGenerator
      hook_for :query, type: :boolean, default: true
    end
  end
end

推荐阅读