【问题标题】:Override default scaffold generator in rails 3覆盖rails 3中的默认脚手架生成器
【发布时间】:2011-01-07 22:37:16
【问题描述】:

我已经为 rails 3 中的控制器创建了一个生成器。 现在我想在使用脚手架生成器时将此生成器用作默认生成器。

这可能吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    自定义控制器文件的正确位置是lib/templates/rails/scaffold_controller/controller.rb

    【讨论】:

    • 对不起,同样的事情。 rails g scaffold user name:string 忽略该文件。
    • rails g scaffold_controller Group 有效,但 rails g scaffold Group 仍然获取默认控制器模板
    • rails g scaffold Group 实际上是在我的包中获取 strong_parameters gem 控制器模板。
    【解决方案2】:

    如果你只是想使用自己的控制器模板,你可以把它放在lib/templates/rails/scaffold_controller/controller.rb

    如果你想替换 scaffold_controller_generator 代码本身,例如,让控制器脚手架生成额外的类文件。您可以使用lib/generators/rails/my_scaffold_controller/templates 下的模板创建lib/generators/rails/my_scaffold_controller/my_scaffold_controller_generator.rb

    记得在config/application.rb 中将rails 指向新的scaffold_controller:

    config.generators do |g|
      g.scaffold_controller = "my_scaffold_controller"
    end
    

    对于my_scaffold_controller_generator.rb,如果您想修改默认行为,可以从railties-3.x.x/lib/rails/generators/rails/scaffold_controller 下的railties gem 复制,或者如果您只想添加功能,可以从它继承:

    require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
    
    module Rails
      module Generators
        class MyScaffoldControllerGenerator < ScaffoldControllerGenerator
          source_root File.expand_path("../templates", __FILE__)
    
          def new_funtionality
          end
    
        end
      end
    end
    

    【讨论】:

      【解决方案3】:

      您可以覆盖 Rails 用于其生成器的模板。在这种情况下,只需将文件放在lib/templates/scaffold_controller/controller.rb 并根据需要进行修改。下次你运行 rails g scaffold [modelName] 时,它会选择这个新的控制器模板并使用它。

      这在Section 6 of the Creating and Customizing Rails Generators官方指南中有介绍。

      【讨论】:

      • 你的路径不适合我。第二个答案是正确的。
      • 请注意任何寻找默认生成器模板进行自定义的人,在撰写本文时,它们位于您的 GEM PATH 中 gems/railties-3.x.x/lib/rails/generators。您可以在命令行上使用$&gt; gem environment 找到您的 GEM PATH。
      【解决方案4】:

      这似乎在 Rails 4 中略有改变。您可以在生成脚手架时看到生成器将在调用行中查找哪个模板,并且您的模板文件夹名称应与此匹配:

      rails generate scaffold blub 
      ...
      invoke  responders_controller
      

      如果你使用 rails g scaffold_controller blubs,模板的位置应该是:

      lib/templates/rails/scaffold_controller/controller.rb
      

      如果你使用 rails g scaffold blub,模板的位置应该是:

      lib/templates/rails/responders_controller/controller.rb
      

      【讨论】:

      • 做到了!没有意识到我应该看调用行来解决这个问题!谢谢:)
      【解决方案5】:

      如果有人想知道为什么这在默认的 Rails 4 安装中不起作用,那是因为 jbuilder 将自己插入到覆盖位置之前的模板路径中。我不需要 jbuilder 所以我删除了它,但我也在 Github 中报告了一个问题。希望它会尽快修复。

      【讨论】:

      • 更新:lib/templates/rails/scaffold_controller/controller.rb 解决了我的问题。有它在 lib/generators/templates/rails/scaffold_controller/controller.rb
      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多