Как создать эшафот для создания другого файла шаблона частичного представления

Я пытаюсь настроить генератор эскизов , и я хотел бы иметь новый partial для представления в том же каталоге, в частности _item, чтобы называть как внутри индекса, так и показывать. Я могу получить все шаблоны, но я не могу сгенерировать этот файл через

rails g scaffold foo name:string

Я попытался поместить _item.erb в /lib/templates/erb/scaffold/ (вместе с другими файлами), но он игнорируется. Кто-нибудь знает?

Я использую ruby ​​на рейках 3, но, пожалуйста, дайте мне знать, действительно ли решение действительно для рельсов 2. Я также использую simple_form (таким образом, у меня уже есть _form partial), но я думаю, что решение должно быть действительно даже без него.

Ответ 1

Просто нашел его.

Он жестко запрограммирован. Вы можете изменить его:

https://github.com/rails/rails/blob/master/railties/lib/rails/generators/erb/scaffold/scaffold_generator.rb

  def available_views
    %w(index edit show new _form)
  end

В моем индексном шаблоне мне понравилось следующее:

        <thead id="thead_js">
        <%%= render 'thead' %>

        <!-- CUT TO _thead.html.erb -->
        <tr>
            <% for attribute in attributes -%>
                <th><%%= sortable( <%= attribute.name %>, <%= attribute.human_name %> ) %></th>
            <% end %>
            <th>&nbsp;</th>
        </tr>
        <!-- END CUT TO -->

    </thead>

Затем просто создайте задачу с граблями, которая читает этот комментарий и создает новые файлы.

Уродливый, но эффективный.

Ответ 2

Я столкнулся с этим вопросом, надеясь найти ответ, поскольку генератор эшафотов по умолчанию очень искалечен, если вы хотите:

  • Рефакторинг ваших видов эшафотов или использование партиций
  • Использование контроллера и просмотр наследования
  • Поддержка дополнительных действий контроллера и их представлений
  • Поддержка сочетания шаблонных движков, erb, haml, slim, jbuilder, креветок и т.д.

Увы, я свернул рукава и понял, как сделать рельсовый эшафот, генератор поддерживает вышеуказанные требования, которые я использую в своем текущем проекте.

Если вам нужен полный контроль над вашими шаблонами эшафотов при вводе rails g scaffold Foo ..., тогда прочитайте!

Проблема

Генератор эшафотов по умолчанию - это специфичный для движка движок, а жесткие коды - фиксированный набор файлов вида, который он ищет.

Решение

Используйте специальный генератор и подключите его к генерации шаблонов.

Я включил генератор ниже, который выглядит в lib/templates/scaffold, и будет генерировать разрешения для всех найденных там файлов, включая шаблоны, частичные и подкаталоги, независимо от механизма шаблона.

IMO, это должно быть поведение рельсов по умолчанию, вместо того чтобы нам прыгать через обручи, подобные этому.

Реализация

Выполните следующие действия:

  • Поместите любые шаблоны или частичные элементы, которые вы хотите создать, когда строительные леса в lib/templates/scaffold. Обратите внимание, что нет подкаталога erb!!
  • Настройте механизм шаблона генератора для вашего проекта, как показано ниже.
  • Добавить мой собственный генератор представлений (см. ниже)

Конфигурация генератора Rails 4:

# config/initializers/generators.rb
Rails.application.config.generators do |g|
  # ...
  g.template_engine :all
  g.fallbacks[:all] = :erb # or haml/slim etc
end

Конфигурация генератора Rails 3:

# config/application.rb
config.generators do |g|
  # ...
  g.template_engine :all
  g.fallbacks[:all] = :erb # or haml/slim etc
end

Пользовательский генератор эшафотов:

# lib/generators/all/scaffold/scaffold_generator.rb
require 'rails/generators/named_base'
require 'rails/generators/resource_helpers'

module All # :nodoc:
  module Generators # :nodoc:
    class ScaffoldGenerator < Rails::Generators::NamedBase # :nodoc:
      include Rails::Generators::ResourceHelpers

      source_root File.join(Rails.root, 'lib', 'templates', 'scaffold', File::SEPARATOR)

      argument :attributes, type: :array, default: [], banner: "field:type field:type"

      def create_root_folder
        empty_directory File.join("app/views", controller_file_path)
      end

      def copy_view_files
        available_views.each do |view|
          template view, File.join("app/views", controller_file_path, view)
        end
      end

    protected
      def available_views
        # use all template files contained in source_root ie 'lib/templates/scaffold/**/*'
        base = self.class.source_root
        base_len = base.length
        Dir[File.join(base, '**', '*')].select { |f| File.file?(f) }.map{|f| f[base_len..-1]}
      end
    end
  end
end

Предостережения

Никакой предлагаемой гарантии:)

Я надеюсь, что это поможет другим, кто хочет реорганизовать свои взгляды с помощью партикулов и поддерживать несколько механизмов шаблонов.

Ответ 3

Я считаю, что это жестко закодировано в эшафот g. То, что я сделал, это создать задачу рейка, которая добавит больше файлов.