如何让scaffold生成另一个部分视图模板文件

我正在尝试自定义我的脚手架生成器 ,我想在同一目录中为视图设置一个新的部分 ,特别是_item 在index和show中都被调用。 我可以获得所有模板,但我无法生成此文件

 rails g scaffold foo name:string 

我试图把_item.erb放在/lib/templates/erb/scaffold/ (和其他文件一起)但是它被忽略了 – 有人有线索吗?

我在rails 3上使用ruby,但如果解决方案对rails 2也有效,请告诉我。 我也使用simple_form(因此我已经有了_form部分),但我认为解决方案即使没有它也应该有效。

刚发现它。

它是硬编码的。 你可以改变它:

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 

在我的索引模板中,我确实喜欢这样:

   <%%= render 'thead' %>   <% for attribute in attributes -%> <%%= sortable( <%= attribute.name %>, <%= attribute.human_name %> ) %> <% end %>      

然后,只创建一个rake任务,读取该注释并创建新文件。

丑陋但有效。

我遇到了这个问题,希望能找到答案,因为如果你想要的话,默认的rails支架生成器已经非常残缺:

  1. 重构您的脚手架视图或使用局部视图
  2. 使用控制器和视图inheritance
  3. 支持其他控制器操作及其视图
  4. 支持混合模板引擎,erb,haml,slim,jbuilder,prawn等

唉,我卷起袖子,弄清楚如何让铁轨脚手架发电机支持我在当前项目中使用的上述要求。

如果您想在键入rails g scaffold Foo ...时完全控制您的脚手架模板,请继续阅读!

问题

默认的rails scaffold生成器是模板引擎特定的,并且硬编码它寻找的一组固定的视图文件。

解决方案

使用自定义生成器并将其连接到脚手架模板生成。

我在下面包含了一个生成器,它在lib/templates/scaffold中查找,并将生成所有文件的脚手架视图,包括模板,部分和子目录,无论模板引擎如何。

IMO这应该是默认的rails行为,而不是我们不得不像这样跳过箍..

履行

请执行下列操作:

  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 

注意事项

没有保修:)

我希望这可以帮助那些想要用部分重构他们的脚手架视图并支持多个模板引擎的人。

我相信这是硬编码到脚手架g。 我所做的是创建一个添加更多文件的rake任务。