我无法避免在我的生成器中重复代码。我试图使用担忧但没有成功。任何人都可以帮助我吗?
我的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.
答案 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/
文件夹。