本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Modules
模块类似于类,它们包含方法、常量以及其他模块和类定义的集合。与类不同,你不能创建基于模块的对象。
模块有两个用途。首先,它们作为一个名称空间,让您定义名称不会与其他地方定义的名称冲突的方法。其次,它们允许你在不同的类之间共享功能。如果一个类混合在 一个模块中,那么该模块的方法就会变得可用,就好像它们是在类中定义的一样。多 个类可以混合在同一个模块中,共享模块的功能而不使用继承。你也可以将多个模块 组合成一个类。
Helper 方法是 Rails 使用模块的一个例子。Rails 会自动将这些 helper 模块混合到适当 的视图模板中。例如,如果希望编写一个可从存储控制器调用的视图调用的 helper 方 法,可以在 store _ helper 中定义以下模块。在 app/helpers 目录下的 rb 文件:
module StoreHelper
def capitalize_words(string)
string.split(' ').map {|word| word.capitalize}.join(' ')
end
end
作为 Ruby 标准库的一部分,有一个模块值得特别提及,因为它在 Rails 中使用: YAML。
YAML
Yaml 是一个递归缩写,代表 YAML ain’t Markup Language。在 Rails 的上下文中,YAML 被用作定义诸如数据库、测试数据和翻译之类的配置的便捷方式。下面是一个 例子:
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
在 YAML 中,缩进是很重要的,所以这就定义了开发是由四个键值对组成的集合,用冒号分隔。YAML 是表示发送数据的一种方法,特别是在与人交互时,而 Ruby 提供了 一种更通用的表示数据的方法,供应用程序使用。
Marshaling Objects
Ruby 可以将一个对象转换成一个字节流,这个字节流可以存储在应用程序之外。这个过程被称为封送处理(Marshaling Objects)。这个保存的对象以后可以由应用程序的另一个实例(或者完全独立的应用程序)读取,并且可以重新构建原来保存的对象的副本。
当你使用封送处理时,会出现两个潜在的问题。首先,有些对象不能被转储。如果要转储的对象包括绑定、过程或方法对象、 IO 类的实例或单例对象——或者如果试图转 储匿名类或模块——将引发 TypeError。
其次,在加载封送对象时,Ruby 需要知道该对象的类的定义(以及它包含的所有对象的定义)。
Rails 使用封送处理来存储会话数据。如果你依赖 Rails 来动态加载类,那么可能某个 特定的类在重构会话数据的时候还没有被定义。因此,在你的控制器中使用模型声明 来列出所有被封送的模型。这种先发制人的方式加载必要的类来使封送处理工作。