1

我在避免生成器中出现重复代码时遇到了麻烦。我曾尝试使用关注点,但没有成功。谁能帮我 ?

我的 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.

4

1 回答 1

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/文件夹中。

于 2015-04-19T11:53:05.967 回答