Ruby on rails 3 如何在Rails 3的控制器中使用mixin或模块?

Ruby on rails 3 如何在Rails 3的控制器中使用mixin或模块?,ruby-on-rails-3,mixins,Ruby On Rails 3,Mixins,我的控制器中有一些行为,我把它们拉到一个模块中,以便更好地测试并在一些地方重复使用。关于这一点,有两个问题: 哪里是放置模块的好地方?它们需要运行才能供控制器使用,所以我考虑的是config/initializers/目录。不过我觉得这有点可疑库/ 如何确保代码运行,以便模块可用于我的控制器中的include 谢谢你们,先生们 lib/是模块的绝佳场所;比config/initializers/好得多——至少在我看来是这样。如果它是几个模块,或者一个大的模块,你也可以考虑把它变成一个插件,把它放

我的控制器中有一些行为,我把它们拉到一个模块中,以便更好地测试并在一些地方重复使用。关于这一点,有两个问题:

  • 哪里是放置模块的好地方?它们需要运行才能供控制器使用,所以我考虑的是
    config/initializers/
    目录。不过我觉得这有点可疑<代码>库/
  • 如何确保代码运行,以便模块可用于我的控制器中的
    include
  • 谢谢你们,先生们

  • lib/
    是模块的绝佳场所;比
    config/initializers/
    好得多——至少在我看来是这样。如果它是几个模块,或者一个大的模块,你也可以考虑把它变成一个插件,把它放在供应商/插件> /代码>。p>
  • 如果将其放入
    lib/
    ,则需要手动
    require
    该文件。默认情况下,Rails不会自动加载
    lib/
    目录中的文件。您可以将require放在一个配置文件中

  • 我通常将额外的自动加载放在
    config/application.rb
    中。类似这样的操作应该可以做到(假设您的
    .rb
    文件位于名为
    lib/my_module
    的目录中):

    您必须确保您的模块是实际的
    模块
    ,而不是
    。然后,您可以简单地将其包括在内:

    # lib/my_module/foobar.rb
    module Foobar
      def foobar
        "Hello world!"
      end
    end
    
    # app/models/my_model.rb
    class MyModel < ActiveRecord::Base
      include Foobar
    end
    
    # rails console
    >> obj = MyModel.first
    => #<MyModel id: 1, ...>
    >> obj.id
    => 1
    >> obj.foobar
    => "Hello world!"
    
    #lib/my_模块/foobar.rb
    Foobar模块
    def foobar
    “你好,世界!”
    结束
    结束
    #app/models/my_model.rb
    类MyModel>obj=MyModel.first
    => #
    >>对象id
    => 1
    >>obj.foobar
    =>“你好,世界!”
    
    尝试将特定于控制器的模块放入
    app/controllers
    。没有
    要求
    要求。

    1)我想说: 应用程序/扩展下的我的类扩展 我在/app/mixins下的模块 我在/app/services下的服务

    2) 您可以将应用程序配置为在config/application.rb中加载所有这些内容: 类扩展应该以正确的方式进行 并且可以将mixin和服务添加到自动加载路径中

      class Application < Rails::Application
        # require class extentions right now
        Dir[Rails.root.join('app', 'extentions', "*.rb")].each {|l| require l }
    
        # Custom directories with classes and modules you want to be autoloadable.
        config.autoload_paths += Dir[Rails.root.join('app', 'mixins', '{**}')]
        config.autoload_paths += Dir[Rails.root.join('app', 'services', '{**}')]
    
    类应用程序

    (我使用的是rails 3)

    除非它们是控制器,否则它们不应该进入
    app/controllers
    。这违背了目录结构的目的。同意,Arbind Thakur的解决方案是最好的。我不喜欢/lib,因为在大型项目中,它肯定会变得很笨拙。下面有层次结构的应用程序/混合是我们最有可能做的。
      class Application < Rails::Application
        # require class extentions right now
        Dir[Rails.root.join('app', 'extentions', "*.rb")].each {|l| require l }
    
        # Custom directories with classes and modules you want to be autoloadable.
        config.autoload_paths += Dir[Rails.root.join('app', 'mixins', '{**}')]
        config.autoload_paths += Dir[Rails.root.join('app', 'services', '{**}')]