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

时间:2011-01-14 23:16:45

标签: ruby-on-rails ruby-on-rails-3 customization scaffold

我正在尝试自定义支架生成器,我希望在同一目录中为视图设置一个新的部分,特别是{{1} }被称为内部索引和显示。我可以获得所有模板,但我无法通过

生成此文件
_item

我试图将_item.erb放在rails g scaffold foo name:string 中(与其他文件一起),但它被忽略了 - 有人有线索吗?

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

3 个答案:

答案 0 :(得分:15)

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

  1. 重构您的脚手架视图或使用局部视图
  2. 使用控制器和视图继承
  3. 支持其他控制器操作及其观点
  4. 支持混合模板引擎,erb,haml,slim,jbuilder,prawn等。
  5. 唉,我卷起袖子,弄清楚如何让导轨脚手架发电机支持我在当前项目中使用的上述要求。

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

    问题

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

    解决方案

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

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

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

    实施

    执行以下操作:

    1. 将脚手架中创建的任何模板或部分放入lib/templates/scaffold。请注意,没有erb子目录!!
    2. 为项目配置生成器模板引擎,如下所示
    3. 添加我的自定义视图生成器(包含在下面)
    4. 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
      

      注意事项

      不提供保修:)

      我希望这有助于其他想要使用partials重构其scaffold视图并支持多个模板引擎的人。

答案 1 :(得分:4)

刚刚找到它。

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

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任务,读取该注释并创建新文件。

丑陋但有效。

答案 2 :(得分:-1)

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