【问题标题】:Rails: hook_for :orm not finding active_recordRails:hook_for:orm 没有找到 active_record
【发布时间】:2013-04-28 08:23:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord orm generator


    【解决方案1】:

    我最终破解了这个,只是在我使用 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 
      

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

    开心!

    【讨论】:

    • 下次我写一些自定义生成器时,我会参考这个。感谢您的彻底回复!
    【解决方案2】:

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

    hook_for :orm, as: :model
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-04
      • 2013-02-23
      • 2014-05-29
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多