【问题标题】:How to prevent Rails controller generator to modify config/routes.rb如何防止 Rails 控制器生成器修改 config/routes.rb
【发布时间】:2014-01-18 23:34:47
【问题描述】:

有时我会运行类似rails g controller foo index 的命令来为控制器和模板生成骨架。

因为我不希望每个控制器都有助手和资产,所以我将以下代码放入config/application.rb

config.generators 做 |g| g.helper 错误 g.assets 错误 结尾

还有一件事我不想发生。生成器在我的config/routes.rb 中添加了一行get "foo/index"。如何预防?

【问题讨论】:

  • 有人要为此功能创建拉取请求吗?
  • @IvanDenisov 从 Rails 4.2 开始,它现在是 Rails 的一部分。

标签: ruby-on-rails ruby generator


【解决方案1】:

未经测试...

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

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

【讨论】:

  • 先生。罗纳德,不幸的是,您的建议不会改变控制器生成器的行为。在 Rails 4.1.0.beta1 上测试。无论如何,谢谢。
  • 似乎g.resource_route控制了资源生成器的行为,但并没有改变控制器生成器的行为。
  • 同意您上面的评论,您似乎无法阻止控制器生成器生成路由(除非您不向其传递任何操作 - 如果没有传递任何操作,则显示为 no路线生成)。您还可以编写一个模板以在生成使用 gsub_file 删除违规路由的控制器后运行。但是,如果您觉得所有这些解决方案听起来比从 routes.rb 中删除路由更多工作,我会同意。
【解决方案2】:

看起来路由生成是硬编码的。看看这个方法 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

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

【讨论】:

  • 谢谢。似乎没有简单的方法来禁用控制器生成器的此功能。确认这个事实就足够了……
  • 这不再是一个正确的答案。 skip_routes true 是 Rails 5 的正确解决方案
【解决方案3】:

如果你想避免所有控制器的资产或助手,那么你可以在 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

【讨论】:

    【解决方案4】:

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

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

    在您的 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 应用程序

    【讨论】:

      【解决方案5】:

      创建您自己的生成器!以下链接将有所帮助:

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          这与直觉相反,但这是您要寻找的:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-01-27
            • 1970-01-01
            • 1970-01-01
            • 2016-11-12
            • 1970-01-01
            • 1970-01-01
            • 2012-03-01
            相关资源
            最近更新 更多