如何防止Rails控制器生成器修改config / routes.rb

有时我运行一个像rails g controller foo index这样的命令来生成控制器和模板的骨架。

因为我不想为每个控制器提供帮助程序和资产,所以我将以下代码放入config/application.rb

 config.generators做| g |
   g.helper false
   g.assets false
结束

还有一件事我不想发生。 生成器在我的config/routes.rb添加一行get "foo/index" 。 我该怎样预防呢?

从Rails 4.2开始,可以使用application.rb中的以下代码禁用路由生成:

 config.generators do |g| g.skip_routes true end 

资料来源: https : //github.com/rails/rails/commit/4b173b8ed90cb409c1cdfb922914b41b5e212cb6

看起来路由生成是硬编码的。 看看这个方法https://github.com/rails/rails/blob/master/railties/lib/rails/generators/rails/controller/controller_generator.rb#L12

我认为,最简单的方法是使用monkey-patch覆盖。 就像是

 module Rails module Generators class ControllerGenerator < NamedBase def add_routes #do nothing... end end end end 

你可以把它放到初始化器并尝试。

未经测试…

 config.generators do |g| g.resource_route false end 

https://github.com/rails/rails/blob/master/railties/lib/rails/generators.rb

由于您希望此特定应用程序不生成路由。

您可以将gems部署到本地/项目文件夹并覆盖它们

在rails项目文件夹中

 bundle install --path /my_rails_path/lib/ 

现在,您可以看到移植到项目lib/文件夹的所有库

转到以下文件(路径更改取决于您的版本)

lib/ruby/1.9.1/gems/railties-3.2.15/lib/rails/generators/rails/controller/controller_generator.rb

并注释函数add_routes

  def add_routes #actions.reverse.each do |action| # route %{get "#{file_name}/#{action}"} #end end 

注意:此技巧不会影响系统中的任何其他rails应用程序

如果要避免所有控制器的资产或帮助程序,则可以在application.rb中编写以下行

 config.generators.stylesheets = false config.generators.javascripts = false config.generators.helper = false 

但是如果想要避免任何1个控制器那么你就像这样生成控制器

 rails g controller test --no_assets rails g controller test --no_helper rails g controller test --no_javascripts rails g controller test --no_stylesheets 

创建自己的发电机! 以下链接将有助于:

http://guides.rubyonrails.org/generators.html

这是违反直觉的,但这是你正在寻找的:

 config.generators do |g| g.skip_routes true end