Я наткнулся на этот вопрос в надежде найти ответ, так как генератор скаффолдов по умолчанию довольно ограничен, если вы хотите:
- Измените ваши представления скаффолдов или используйте частичные
- Использование контроллера и просмотр наследования
- Поддержка дополнительных действий контроллера и их просмотр
- Поддержка различных шаблонизаторов, erb, haml, slim, jbuilder, prawn и др.
Увы, я закатал рукава и выяснил, как заставить генератор рельсовых лесов поддерживать вышеуказанные требования, которые я использую в своем текущем проекте.
Если вам нужен полный контроль над шаблонами скаффолдов при наборе rails g scaffold Foo ...
, тогда читайте дальше!
Проблема
Генератор скаффолдов по умолчанию для rails - это специальный движок шаблонов, а жесткие коды - это фиксированный набор файлов просмотра, которые он ищет.
Решение
Используйте собственный генератор и подключите его к генерации шаблона скаффолда.
Я включил генератор ниже, который выглядит как 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
Предостережения
Гарантия не предоставляется:)
Надеюсь, это поможет тем, кто хочет реорганизовать свои представления скаффолдов с помощью частичных функций и поддерживать несколько шаблонизаторов.