2013-05-03 20 views
2

我在写一个自定义生成器。大多数情况下,发生器能够成功使用钩子。例如,Rails:hook_for:orm not finding active_record

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

有没有办法让我的发电机正确挂钩活动记录?

回答

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 
    

您刚才创建的默认生成器,你可以从你的模板文件夹中再次改写。 =)

nJoy!

+0

下次我写了一些自定义生成器,我会参考这一点。感谢彻底的回应! – nullnullnull 2013-08-03 04:02:06