Rails 5 - Как создать собственный генератор скаффолдов? - PullRequest
0 голосов
/ 03 декабря 2018

Цель - команда ...

bin/rails generate custom_scaffold Thing

... для генерации следующих 6 файлов:

db/migrate/201812031331_create_things.rb
app/models/thing.rb
app/controllers/things_controller.rb
app/serializers/thing_serializer.rb
test/fixtures/things.yml
test/integration/requests/things_request_test.rb

... с использованием Rails5.

Моя текущая настройка генерирует app/models/thing.rb, но не заполняет ее Thing.

Ожидается:

class Thing < ApplicationRecord

end

В настоящее время:

class <%= class_name %> < ApplicationRecord

end

Я прочитал эти направляющие , но безрезультатно.

У кого-нибудь есть рабочий пример?


Моя настройка:

# lib/generators/custom_scaffold/custom_scaffold_generator.rb

class CustomScaffoldGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('templates', __dir__)

  def create_files
    copy_file 'migration.rb', "db/migrate/#{timestamp}_create_#{plural_name}.rb"
    copy_file 'model.rb', "app/models/#{file_name}.rb"
    copy_file 'controller.rb', "app/controllers/#{plural_name}_controller.rb"
    copy_file 'serializer.rb', "app/serializers/#{file_name}_serializer.rb"
    copy_file 'fixture.yml', "test/fixtures/#{plural_name}.yml"
    copy_file 'request_test.rb', "test/integration/requests/#{plural_name}_request_test.rb"
  end

  private

  def timestamp
    Time.now.utc.strftime('%Y%m%d%H%M%S')
  end
end
# lib/generators/custom_scaffold/templates/model.rb

class <%= class_name %> < ApplicationRecord

end
# lib/generators/custom_scaffold/templates/controller.rb

module V1
  module Public
    class <%= class_name.pluralize %>Controller < ApplicationController

    end
  end
end
# lib/generators/custom_scaffold/templates/migration.rb
# Ignore for now
# lib/generators/custom_scaffold/templates/serializer.rb
# Ignore for now
# lib/generators/custom_scaffold/templates/fixture.yml
# Ignore for now
# lib/generators/custom_scaffold/templates/request_test.rb
# Ignore for now
# Gemfile

source 'https://rubygems.org'

ruby '2.4.1'
gem 'rails', '~> 5.1.6'
gem 'puma', '~> 3.7'
gem 'pg'
gem 'rack-cors', require: 'rack/cors'
gem 'olive_branch'
gem 'fast_jsonapi'
gem 'awesome_print'
gem 'byebug', '~> 10.0', groups: %i[development test]
gem 'yaml_db'

group :development do
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'mina', '~> 1.2', require: false
  gem 'mina-puma', require: false
  gem 'rubocop', require: false
  gem 'annotate', require: false
end

1 Ответ

0 голосов
/ 25 декабря 2018

Вам необходимо указать файл как шаблон Thor.Rails использует шаблоны Thor для генерации шаблонов с кодом стиля ERB внутри них.

Заменить:
copy_file 'model.rb', "app/models/#{file_name}.rb"

С:
template 'model.rb.tt', "app/models/#{file_name}.rb"

Путем добавлениярасширение .tt, которое вы указываете генератору обрабатывать файл как шаблон Thor, который будет интерпретировать код Ruby (стиль ERB) внутри файла, а затем создаст файл с тем же именем без расширения .tt.Любой файл, который у вас есть без расширения .tt, будет скопирован генератором оптом, без выполнения какого-либо кода внутри.

Полезный совет : Иногда вы хотите оставить некоторый код ERB внутриФайл шаблона Thor без его выполнения.По умолчанию любые теги стиля ERB внутри файла .tt будут обработаны, и вместо них в выходной файл будет записана строка.Вы можете избежать обработки тегов ERB, но используя двойной знак процента в теге.

Например, допустим, у вас есть файл с именем foo.erb.tt, который создаст файл foo.erb при запуске генератора.Скажем также, что у нас есть переменная article_name и ее значение равно Breaking News

Если вы поместите <%= article_name %> в файл, он будет записывать Breaking News в foo.erb.

Если вы поставите <%%= article_name %> (обратите внимание на %%), он будет писать <%= article_name %> в foo.erb.

. Я нашел следующую справку удобной при изучении этого материала.

Thor предлагает несколько действий, которые помогают при выполнении задач сценария и генератора.Вы можете быть знакомы с ними, так как некоторые из них пришли из Rails Templates.Это: say, ask, yes?, no?, add_file, remove_file, copy_file, template, directory, inside, run, inject_into_fileи еще пару.

...