【发布时间】:2011-02-05 12:54:45
【问题描述】:
我正在使用 Ruby on Rails 3,我想在模块中移动一些自定义和共享代码。
- 我应该使用什么语法来编写模块代码?
- 我必须在我的应用程序的哪个文件夹中放置模块文件?
- 如何将该模块包含在一个或多个控制器类中?
- 如果有的话,我还必须在我的应用程序的任何位置使用自定义模块吗?
- 如何从我的应用程序调用模块中的方法?
提前致谢。
【问题讨论】:
-
非常好!我需要它。
我正在使用 Ruby on Rails 3,我想在模块中移动一些自定义和共享代码。
提前致谢。
【问题讨论】:
到 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。 首先,确保应用程序的每个类都需要您的模块。如果不是的话,只在需要的地方包含它是有意义的,以免使不需要它的类膨胀。如果您真的希望在任何地方都使用该模块,请查看应用程序中类的类层次结构。您想要所有型号的模块吗?你可以打开 ActiveRecord::Base 并在那里添加你的模块。
【讨论】:
lib 文件夹中来创建一个如上所述的模块,重要的注意事项是使Rails3 能够取消注释config\application.rb 中的行config.autoload_paths - 阅读例如@987654321 @ ... 另请注意,您必须小心为您的模块使用与模块名称本身匹配的文件名。所以如果你把它保存在lib/test/my_module.rb,你必须include Test::MyModule——更多细节见stackoverflow.com/questions/4073856/rails-3-autoload
app/models。如果您的代码确实是一个“库”并且可以存在于其上自己的,我建议vendoring一个gem。例如,见github.com/shageman/the_next_big_thing
一个>1。您可以使用与任何其他 ruby 类相同的语法。例如,我正在定义一个 VehicleClassifer 模块,该模块将使用分类车辆方法根据车辆作为输入接收到的车轮数量对车辆进行分类。
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
在您使用模块的类中,您将可以访问模块的所有方法。
此外,如果您需要在整个应用程序中使用模块,您可以将它包含在您的应用程序控制器中。
【讨论】:
ApplicationHelper 中包含和使用这些自定义模块吗?