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

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

rails g scaffold foo name:string

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

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

Ответы [ 3 ]

15 голосов
/ 30 августа 2013

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

  1. Измените ваши представления скаффолдов или используйте частичные
  2. Использование контроллера и просмотр наследования
  3. Поддержка дополнительных действий контроллера и их просмотр
  4. Поддержка различных шаблонизаторов, erb, haml, slim, jbuilder, prawn и др.

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

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

Проблема

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

Решение

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

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

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

Осуществление

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

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

Конфигурация генератора 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

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

Гарантия не предоставляется:)

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

4 голосов
/ 20 марта 2011

Только что нашел.

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

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>

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

Ужасно, но эффективно.

0 голосов
/ 20 марта 2011

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

...