我正在尝试制作简单的视图生成器并使用DRY原则,我不想拥有自己的html(erb / haml / slim)模板。我希望我的生成器挂钩到现有的模板引擎并传递一些参数。
我的view_generator.rb
文件如下所示:
class ViewGenerator < Rails::Generators::NamedBase
source_root File.expand_path('../templates', __FILE__)
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
def some_custom_method
(...)
end
hook_for :template_engine, :as => :scaffold
end
这一切都很好。我想在some_custom_method
中做的是添加几个属性:
def some_custom_method
new_attribute = Rails::Generators::GeneratedAttribute.new("description")
new_attribute.type = :integer
attributes << new_attribute
end
我在new_attribute
数组中插入attributes
会发生什么,但是当执行hook_for
时,attribute
变量将恢复为从命令行传递的原始变量。
如何绕过这个?
答案 0 :(得分:1)
在调用点some_custom_method
时,已经设置了属性(通过ARGV
)并且通过检查代码我没有看到从那里改变它们的明确方法。您可以通过在生成器中覆盖start
类方法并直接操作args来使用另一种方法,如下所示:
class ViewGenerator < Rails::Generators::NamedBase
# your code ...
def self.start(args, config)
args.insert(1, 'description:integer') # 0 being the view name
super
end
end