如何使用Ruby on Rails 3创建和使用模块?

use*_*052 90 module ruby-on-rails-3

我正在使用Ruby on Rails 3,我想在模块中移动一些自定义和共享代码.

  1. 我应该用什么语法来编写模块代码?
  2. 在我的应用程序的哪个文件夹中,我必须放置模块文件?
  3. 我如何将该模块包含在一个或多个控制器类中?
  4. 如果有的话,我还需要在我的应用程序中的任何位置使用自定义模块吗?
  5. 如何从我的应用程序中调用模块中的方法?

提前致谢.

Ste*_*han 114

要1.通过简单地说:创建/打开模块:

module MyModule
  def first_module_method
  end
end
Run Code Online (Sandbox Code Playgroud)

至2. lib文件夹.如果要在lib文件夹中组织模块,可以将它们自己放入模块中.例如,如果您想要一个子文件夹,super_modules您的模块将定义如下:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

至3./5.将模块包含在类中时,您可以简单地调用模块方法,就好像它们是在类中定义的一样:

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end
Run Code Online (Sandbox Code Playgroud)

要4.首先,确保在您的应用程序的每个类中确实需要您的模块.如果不是这样,只将它包含在需要的地方是有意义的,这样就不会使那些不需要它的类膨胀.如果你真的想在任何地方使用该模块,请在应用程序中查看类的类层次结构.你想要所有型号的模块吗?您可以打开ActiveRecord :: Base并在那里添加您的模块.

  • 我刚刚发现了我的这个老答案.:(我想downvote.不要在lib中放任何东西!如果代码需要访问其他模型,请将你的代码(包括附加模块)放入`app/models`.如果你的代码真的是'库'并且可以存在就我自己而言,我建议销售一个宝石.例如,请参阅https://github.com/shageman/the_next_big_thing (6认同)
  • 一旦你通过将它包含在`lib`文件夹中创建了一个模块,一个重要的注意事项是让Rails3取消注释`config\application.rb`中`config.autoload_paths`的行 - 例如,http:// stackoverflow.com/questions/1073076/rails-lib-modules-and ...另请注意,您必须小心使用与模块名称本身匹配的模块文件名.因此,如果将其保存在`lib/test/my_module.rb`中,则必须"包含Test :: MyModule" - 有关详细信息,请参阅http://stackoverflow.com/questions/4073856/rails-3-autoload (5认同)
  • 这里有很多不清楚的地方.要提供什么文件名?不包括所有模块时如何调用方法?我不敢相信有这么多的赞成,因为我仍然不知道如何在最后使用模块. (3认同)
  • 为了组织文件,我可以在'lib'文件夹中创建子文件夹吗?如果是这样,有什么变化? (2认同)
  • @ user502052我已经更新了第2点的答案来回答这个问题. (2认同)