Изменить аргумент перед переходом к крючку в генераторе рельсов

Я пытаюсь сделать простой генератор представлений и, используя принцип 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 возвращается к исходной, переданной из командной строки.

Как я могу обойти это?


person Viktor    schedule 15.12.2012    source источник


Ответы (1)


В момент вызова some_custom_method атрибуты уже установлены (через ARGV), и, проверяя код, я не вижу четкого способа изменить их оттуда. Вы можете использовать другой подход, переопределив метод класса start в вашем генераторе и напрямую управляя аргументами, например так:

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
person Ahmad Sherif    schedule 15.12.2012
comment
Спасибо за ответ! Я вставил этот метод, но он все еще не работает. Я пытался сделать его как публичным, так и приватным. Кроме того, я не уверен, что он когда-либо вызывался, потому что я вставил некоторые отладочные вызовы, и ничего не было напечатано на консоли. - person Viktor; 16.12.2012
comment
Плохо, я использовал неправильное имя для функции, пожалуйста, проверьте ответ еще раз. - person Ahmad Sherif; 16.12.2012