我正在编写一个自定义生成器。在大多数情况下,生成器能够成功地使用钩子(Hook)。例如,
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
有没有办法让我的生成器正确 Hook 事件记录?
最佳答案
只有在我使用 hook_for
和 remove_hook_for
进行了一项狡猾的工作之后,我才最终破解了这个问题。我的建议是不要管它,因为不值得这么麻烦。
这种方式使用更少的代码,为您的工作带来更多成果。
您可能需要使用一些技巧。
留在 Rails::Generators 命名空间内。
我使用的文件夹结构是:
lib/generators/my_own_model/ templates/ my_own_model_generator.rb
在模型中为要创建的生成器设置配置
这就是克服
错误(无论[未找到])
令人头疼的问题所需的全部内容。代码如下所示
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
第三个技巧是隐藏您的生成器名称。你为什么这么问?那么您可能想知道您将不再需要它。
$ rails g model MyNewModel generator:belongs_to my_own:boolean
您刚刚创建了一个默认生成器,您可以从模板文件夹中再次覆盖它。 =)
nJoy!
关于ruby-on-rails - rails : hook_for :orm not finding active_record,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16367261/