在传递到rails生成器中的钩子之前更改参数

时间:2012-12-15 18:17:22

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 thor

我正在尝试制作简单的视图生成器并使用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变量将恢复为从命令行传递的原始变量。

如何绕过这个?

1 个答案:

答案 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