ruby: 避免生成器中的重复方法
ruby: avoid duplicate method in genertors
我无法避免生成器中的重复代码。我曾尝试使用关注点但没有成功。谁能帮帮我?
我的 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.
为了能够将关注模块中的方法用作其他 classes 中的实例方法,它应该进入 included
块。
要从关注的 class 方法中创建方法,您可以将它们放入 ClassMethods
模块中。
因为你调用 initialize()
作为 class 方法,你实际上应该在 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/
文件夹中。
我无法避免生成器中的重复代码。我曾尝试使用关注点但没有成功。谁能帮帮我?
我的 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.
为了能够将关注模块中的方法用作其他 classes 中的实例方法,它应该进入 included
块。
要从关注的 class 方法中创建方法,您可以将它们放入 ClassMethods
模块中。
因为你调用 initialize()
作为 class 方法,你实际上应该在 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/
文件夹中。