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


90

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

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

提前致谢。


2
很好!我需要
奥雅纳(Arup Rakshit)2014年

Answers:


115

要1.通过简单说出一个模块来创建/打开:

module MyModule
  def first_module_method
  end
end

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

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

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

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

首先,请确保4.在您的应用程序的每个类中都确实需要您的模块。如果不是,那么只在需要的地方包含它是有意义的,这样就不会使那些根本不需要它的类classes肿。如果您真的想在各处使用该模块,请在应用程序中查看您的类的类层次结构。您是否需要所有型号的模块?您可以打开ActiveRecord :: Base并在其中添加添加模块。


2
为了整理文件,我可以在“ lib”文件夹中创建一个子文件夹吗?如果是这样,会有什么变化?
user502052 2011年

2
@ user502052我已将答案更新为第2点,以回答该问题。
斯蒂芬

3
许多事情在这里还不清楚。要提供什么文件名?不包括所有模块时如何调用方法?我不敢相信会有如此之多的投票,因为我仍然不知道最后如何使用模块。
奥古斯丁·里丁格

5
一旦通过在lib文件夹中包含上述模块创建了一个模块,一个重要的注意事项就是使Rails3取消注释该行config\application.rb的内容config.autoload_paths-阅读例如stackoverflow.com/questions/1073076/rails-lib-modules-and ...注意同样,您必须小心使用与模块名称本身匹配的模块文件名。因此,如果将其保存在中lib/test/my_module.rb,则必须include Test::MyModule-有关更多详细信息,请参见stackoverflow.com/questions/4073856/rails-3-autoload
sameers

6
我刚刚找到了我的这个老答案。:(我想投票。不要在lib中放任何东西!app/models如果代码需要访问其他模型,则将您的代码(包括附加模块)放入其中。如果您的代码是真正的“库”并且可以独立存在,我例如,请参阅github.com/shageman/the_next_big_thing
Stephan

3

A> 1。您可以使用与任何其他ruby类相同的语法。例如,我正在定义一个VehicleClassifer模块,该模块将使用classify_vehicle方法根据其作为输入接收的车轮数对车辆进行分类。

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

A> 2。模块通常存储在/ lib文件夹中。

问题3、4、5的答案大致相同。您可以使用

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

在您正在使用该模块的类中,您将有权访问该模块的所有方法。

另外,如果您需要在整个应用程序中使用模块,则可以将其包含在应用程序控制器中。


2
我对此进行了尝试,并得到了未定义的方法错误。知道我做错了什么吗?
托尼

您确定您的模块可访问吗?stackoverflow.com/questions/6604272/…也许可以帮助您?
Shreyas 2012年

1
@Tony-您可能需要重新启动服务器-即使在开发模式下,也要使模块的方法可用。每次更改模块中的代码时,都必须再次重新启动服务器。例如,如果出现错误,或者它将在旧代码上出错,但是在错误msg的那一行上突出显示了新代码-非常令人困惑。
JosephK

知道如何在其中包含和使用这些自定义模块ApplicationHelper吗?
WM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.