Ruby Gem 的一些心得

November 27, 2012 19:32


rails的Generator

在MyGem/lib/rails/mygen/config.rb

class ConfigGenerator < Rails::Generators::Base
  def create_config_file
    create_file "config/config.yml", {foo: 1}.to_yml
  end
end

然后就可以在安装了此gem包的rails项目中rails g mygem:config来生成config.yml文件了

rails::Railtie

class Railtie < Rails::Railtie
  initializer "initialize block" do
    # rails初始时执行
  end

  # 在这里可以对Rails进行各种配置
end

其实这个我目前只知道用来initialize而已,更多的以后要用了再看。。

ActiveSupport::Concern

今天正苦恼于include一个模块M1, 但这个模块include的模块M2和class中include模块M2有问题。。这个我都有点说不清了。。看代码吧

module M1
  def m1
     puts "m1"
  end
end

module M2
  include M1
  extend M1

  def m2
     puts "m2"
  end
end

class C1
  include M2
end

C1.m1 # error
M2.m1 # m1

在上面代码中,C1.m1调用出现的错误,因为只是M2有了m1方法, 然后我要这么实现还要自己写代码??就去看看Mongoid的代码了

看到了ActiveSupport::Concern,看了下源代码,只有短短的二十来行

这不正是我想要的么

module M1
  def m1
     puts "m1"
  end
end

module M2
  include M1
  extend ActiveSupport::Concern

  included do
    extend M1
  end

  def m2
     puts "m2"
  end
end

class C1
  include M2
end

C1.m1 # m1
M2.m1 # error

好了,现在就会出现上面的情况,C1已经有了m1方法了 像Mongoid中,include Mongoid::Document, 然后这个类和类的实例都有mongoid的方法了就是如此实现的

Comments: