我正在使用Ruby on Rails 3并且我正在尝试实现一个新的插件。为了学习,我正在观看内部,我正在研究一些流行的插件。
我选择的是WillPaginate,a its file中有类似的内容:
module WillPaginate
class << self
...
end
end
if defined? Rails
WillPaginate.enable_activerecord if defined? ActiveRecord
WillPaginate.enable_actionpack if defined? ActionController
end
我想知道
为什么if defined? Rails
语句超出module
语句?什么时候会在里面运行istructions?
我应该使用class << self
的方法和方式
答案 0 :(得分:1)
if defined? Rails
块在加载时评估,即在require 'will_paginate'
期间。这样就可以在有或没有Rails的情况下使用will_paginate。
class << self
部分是一种在WillPaginate模块上定义一组方法的方法,而不必将它们全部定义为def self.method_name
。无论哪种方式都有效(除了我现在不记得的一些边缘情况),所以它主要只是一种风格选择。
答案 1 :(得分:1)
module WillPaginate
定义了Ruby名称范围并对这些方法进行分组,以便稍后可以将它们包含在某个类中。 if defined? Rails
位于模块之外,因为if
内的代码可能会将整个模块包含到某些ActiveRecord类中。 if
正好在加载will_paginate.rb
文件时执行。
该块中的所有方法都是类方法。所以稍后可以拨打YourModelClass.foo
。