我遇到了这个问题,希望能找到答案,因为如果你想的话,默认的 rails 脚手架生成器已经很残废了:
- 重构脚手架视图或使用局部视图
- 使用控制器和视图继承
- 支持额外的控制器动作及其视图
- 支持混合模板引擎、erb、haml、slim、jbuilder、prawn 等
唉,我卷起袖子想出了如何使 rails 脚手架生成器支持我在当前项目中使用的上述要求。
如果您想在键入时完全控制脚手架模板,请rails g scaffold Foo ...
继续阅读!
问题
默认的 rails 脚手架生成器是特定于模板引擎的,并且对它查找的一组固定视图文件进行硬编码。
解决方案
使用自定义生成器并将其连接到脚手架模板生成。
我在下面包含了一个生成器,它lib/templates/scaffold
会查看并为在那里找到的所有文件生成脚手架视图,包括模板、部分和子目录,无论模板引擎如何。
IMO这应该是默认的rails行为,而不是我们必须像这样跳过箍..
执行
请执行下列操作:
- 将脚手架时要创建的任何模板或部分放入
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
注意事项
不提供保修:)
我希望这可以帮助那些想用部分重构他们的脚手架视图并支持多个模板引擎的人。