Как создать эшафот для создания другого файла шаблона частичного представления
Я пытаюсь настроить генератор эскизов , и я хотел бы иметь новый 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> </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. То, что я сделал, это создать задачу рейка, которая добавит больше файлов.