如何在Rails 3中的控制器中使用mixins或模块?

jer*_*son 27 mixins ruby-on-rails-3

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

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

谢谢你,先生.

von*_*rad 38

  1. lib/是模块的绝佳场所; 比config/initializers/我更好 - 至少在我看来.如果是几个模块或一个大模块,您还可以考虑将其作为插件并放入其中vendor/plugins.

  2. 如果你把它放进去lib/,你需要手动require输入文件.默认情况下,Rails不会自动加载目录中的lib/文件.您可以将require放在一个配置文件中.

我通常把我的额外自动加载config/application.rb.这样的事情应该成功(假设你的.rb文件在一个名为的目录中lib/my_module):

config.autoload_paths += Dir["#{Rails.root}/lib/my_module"]
Run Code Online (Sandbox Code Playgroud)

你必须确保你的模块是实际的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!"
Run Code Online (Sandbox Code Playgroud)