关于插件中的类的一些问题

时间:2011-03-15 18:03:55

标签: ruby-on-rails ruby ruby-on-rails-3 class plugins

我正在使用Ruby on Rails 3并且我正在尝试实现一个新的插件。为了学习,我正在观看内部,我正在研究一些流行的插件。

我选择的是WillPaginatea its file中有类似的内容:

module WillPaginate
  class << self
    ...
  end
end

if defined? Rails
  WillPaginate.enable_activerecord if defined? ActiveRecord
  WillPaginate.enable_actionpack if defined? ActionController
end

我想知道

  1. 为什么if defined? Rails语句超出module语句?什么时候会在里面运行istructions?

  2. 我应该使用class << self的方法和方式

2 个答案:

答案 0 :(得分:1)

if defined? Rails块在加载时评估,即在require 'will_paginate'期间。这样就可以在有或没有Rails的情况下使用will_paginate。

class << self部分是一种在WillPaginate模块上定义一组方法的方法,而不必将它们全部定义为def self.method_name。无论哪种方式都有效(除了我现在不记得的一些边缘情况),所以它主要只是一种风格选择。

答案 1 :(得分:1)

  1. module WillPaginate定义了Ruby名称范围并对这些方法进行分组,以便稍后可以将它们包含在某个类中。 if defined? Rails位于模块之外,因为if内的代码可能会将整个模块包含到某些ActiveRecord类中。 if正好在加载will_paginate.rb文件时执行。

  2. 该块中的所有方法都是类方法。所以稍后可以拨打YourModelClass.foo

  3. 等电话