ruby:避免在生成器中使用重复方法

时间:2015-04-19 11:37:47

标签: ruby-on-rails ruby activesupport-concern

我无法避免在我的生成器中重复代码。我试图使用担忧但没有成功。任何人都可以帮助我吗?

我的3个生成器具有相同的方法:

# Initialize the generator accepting attributes as arguments  
  def initialize(*args, &block)
    super
    @attributes = []
    model_attributes.each do |attribute|
      @attributes << Rails::Generators::GeneratedAttribute.new(*attribute.split(":")) if attribute.include?(":")
    end
  end

所以我在lib/generators/concerns创建了一个名为initializer.rb

的文件
module Initializer
  extend ActiveSupport::Concern

  # Initialize the generator accepting attributes as arguments  
  def initialize(*args, &block)
    super
    @attributes = []
    model_attributes.each do |attribute|
      @attributes << Rails::Generators::GeneratedAttribute.new(*attribute.split(":")) if attribute.include?(":")
    end
  end
end

我将这种方式包含在我的生成器中:

class MyViewsGenerator < Rails::Generators::NamedBase
  include Initializer
  initialize()

但是当我调用一代时,它会因此错误而失败:

Error: uninitialized constant MyViewsGenerator::Initializer.

1 个答案:

答案 0 :(得分:2)

为了能够将关注模块中的方法用作其他类中的实例方法,它应该进入included块。

要从关注类方法创建方法,您可以将它们放入ClassMethods模块。

由于您将initialize()称为类方法,因此您应该实际放入ClassMethods模块中:

module Initializer
  extend ActiveSupport::Concern

   included do # instance methods goes here
    end

    module ClassMethods # class methods goes here
      # Initialize the generator accepting attributes as arguments
      def initialize(*args, &block)
       # ...
      end
    end

 end

按照惯例,将模块放入models/concerns/文件夹。