2

我正在编写一个自定义生成器。在大多数情况下,生成器能够成功使用钩子。例如,

hook_for :resource_route, in: :rails, required: true

resource_route按预期调用。然而:

hook_for :orm, in: :rails, required: true

返回错误:

error  active_record [not found]

我假设这是因为active_record_generator它位于与其他生成器(例如生成器)截然不同的目录中resource_route

rails / activerecord / lib / rails / generators / active_record.rb

rails / railties / lib / rails / generators / rails / resource_route / resource_route_generator.rb

有没有办法让我的生成器正确挂钩活动记录?

4

2 回答 2

2

我最终破解了这个,只是在我解决了使用hook_forremove_hook_for失败的问题之后。我的建议不要管它,这不值得麻烦。

这种方式使用更少的代码为您的工作带来更多的结果。

您可能想使用一些技巧。

  1. 留在 Rails::Generators 命名空间内。

    我使用的文件夹结构是:

    lib/generators/my_own_model/
                               templates/
                               my_own_model_generator.rb
    
  2. 在模型中为您要创建的生成器设置配置

    error whatever [not found]这就是克服头痛所需要的一切。

    代码看起来像这样

    require 'rails/generators/active_record/model/model_generator'
    
    module Rails
      module Generators
    
        hide_namespace 'my_own_model'
    
        class Railtie < ::Rails::Engine
          if config.respond_to?(:app_generators)
            config.app_generators.orm = :my_own_model
          else
            config.generators.orm = :my_own_model
          end
        end
    
        class MyOwnModelGenerator < ActiveRecord::Generators::ModelGenerator
          source_root "#{base_root}/active_record/model/templates" 
    
             # all public methods will get executed by rails g  
    
             protected
    
             # these won't but can be overwritten by sub classes
    
             private
    
             # these are still exposed to your templates nifty
        end
      end
    end
    
  3. 第三个技巧是隐藏您的生成器名称。你为什么这么问?好吧,您可能想知道您将不再需要它。

    $ rails g model MyNewModel generator:belongs_to my_own:boolean 
    

您刚刚创建了一个默认生成器,您可以从模板文件夹中再次覆盖它。=)

开心!

于 2013-08-03T00:28:09.657 回答
1

至少在 Rails 5 中,您需要指定生成器的类型 (:model, :migration, :application_record)

hook_for :orm, as: :model
于 2020-04-03T20:29:01.287 回答