Rails。使用Scaffold同时生成HTML和JS视图。

问题描述 投票:0回答:2

我读了一下关于 发电机但找不到任何关于创建视图的信息。通过阅读 Rails 3发电机 gem中,我发现你可以通过将新的模板放在 lib/generators/erb/scaffold/templates/. 您还可以在 "视图 "中指定您要创建的视图。scaffold_generator.rb 文件,其中有一个像这样的片段。

def available_views
  ['index', 'edit', 'show', 'new', '_form']
end

所以我的问题是,如果我想同时创建一个... ... index.html.erb 文件和一个 index.js.erb 文件?

ruby-on-rails view generator
2个回答
1
投票

很明显,视图的实际创建是由一个叫做 copy_view_files. 你可以在该函数中指定你想要的视图类型。这样做之后,我的 scaffold_generator.rb 看起来像这样。

需要 "railsgeneratorserbscaffoldscaffold_generator

module Erb
  module Generators
    class ScaffoldGenerator < Erb::Generators::ScaffoldGenerator
      source_root File.expand_path(File.join('..', 'templates'), __FILE__)

      def copy_view_files
        primary_views.each do |view|
          filename = filename_with_extensions view
          template "#{view}.html.erb", File.join('app', 'views', controller_file_path, filename)
          template "#{view}.js.erb", File.join('app', 'views', controller_file_path, filename)
        end
      end

      hook_for :form_builder, :as => :scaffold

      protected
        def primary_views
          ['index', 'edit', 'show', 'new']
        end

        def handler
          :erb
        end
    end
  end
end

请注意,在 copy_view_files 函数,有两次对 template. 第一个创建一组html视图,而第二个创建我想要的js视图。


0
投票

类似于我发的问题的答案 https:/stackoverflow.coma62441675385730。.

您可以覆盖脚手架生成器 lib/rails/generators/erb/scaffold/scaffold_generator.rb 文件。

步骤1:复制最新的 scaffold_generator.rb 文件。

mkdir -p lib/rails/generators/erb/scaffold && cp $(bundle show railties)/lib/rails/generators/erb/scaffold/scaffold_generator.rb lib/rails/generators/erb/scaffold/

第二步:添加自定义代码添加自定义代码来生成 .js.erb 您想要的文件。

# frozen_string_literal: true

require "rails/generators/erb"
require "rails/generators/resource_helpers"

module Erb # :nodoc:
  module Generators # :nodoc:
    class ScaffoldGenerator < Base # :nodoc:
      include Rails::Generators::ResourceHelpers

      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|
          formats.each do |format|
            filename = filename_with_extensions(view, format)
            template filename, File.join("app/views", controller_file_path, filename)
          end
        end
        javascript_views.each do |view|
          path = File.join('app', 'views', controller_file_path, "#{view}.js.erb")
          File.open(path, "w")
        end  
      end

    private

      def available_views
        %w(index edit show new _form)
      end

      def javascript_views
        %w(index show create update)
      end

    end
  end
end

现在,当您运行脚手架生成器时,您会看到新的 .js.erb 创建的文件。

© www.soinside.com 2019 - 2024. All rights reserved.