【问题标题】:How can I use mixins or modules in my controllers in Rails 3?如何在 Rails 3 的控制器中使用 mixins 或模块?
【发布时间】:2011-04-26 02:22:20
【问题描述】:

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

  1. 哪里是放置模块的好地方?它们需要运行才能对控制器可用,所以我在想config/initializers/ 目录。不过,这对我来说似乎有点可疑。 lib/?
  2. 如何确保代码能够运行,以便控制器中的include 可以使用这些模块?

谢谢各位大佬。

【问题讨论】:

    标签: ruby-on-rails-3 mixins


    【解决方案1】:
    1. lib/ 是放置模块的好地方;比config/initializers/ 好得多——至少在我看来。如果是几个模块,或者一个大模块,也可以考虑做一个插件,放在vendor/plugins

    2. 如果将其放入 lib/,则需要手动 require 文件。默认情况下,Rails 不会自动加载 lib/ 目录中的文件。您可以将要求放在您的配置文件之一中。

    我通常将额外的自动加载放在config/application.rb 中。这样的事情应该可以解决问题(假设您的 .rb 文件位于名为 lib/my_module 的目录中):

    config.autoload_paths += Dir["#{Rails.root}/lib/my_module"]
    

    您必须确保您的模块是实际的module 而不是class。然后,您可以简单地包含它:

    # 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!"
    

    【讨论】:

      【解决方案2】:

      尝试将控制器特定模块放入app/controllers。不需要require

      【讨论】:

      • 除非他们是控制器,否则他们不应该进入app/controllers。这违背了目录结构的目的。
      • 同意,Arbind Thakur 的解决方案是最好的。我不是 /lib 的粉丝,因为在大型项目中肯定会变得笨拙。 app/mixins 下面有一个层次结构是我们最有可能做的。
      【解决方案3】:

      1) 我喜欢说: 我在 app/extensions 下的类扩展 我在 /app/mixins 下的模块 我在 /app/services 下的服务

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

        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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-10
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2013-04-18
        • 2013-12-22
        相关资源
        最近更新 更多