插件扩展

本文指导您如何创建一个能在Rails模型中输出'HelloWorld!'的插件,包括插件目录生成、方法实现及模型集成步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何实现一个简单的插件?下面实现一个在model中能输出hello world的插件。

注:()中的斜体是本人的心得体会,可忽略。

第一步,在工程目录下新建一个插件,运行

Shell代码 收藏代码
  1. railsgeneratepluginHelloWorld


这个命令会生成以下目录文件:

Shell代码 收藏代码
  1. createvendor/plugins/hello_world
  2. createvendor/plugins/hello_world/MIT-LICENSE
  3. createvendor/plugins/hello_world/README
  4. createvendor/plugins/hello_world/Rakefile
  5. createvendor/plugins/hello_world/init.rb
  6. createvendor/plugins/hello_world/install.rb
  7. createvendor/plugins/hello_world/uninstall.rb
  8. createvendor/plugins/hello_world/lib
  9. createvendor/plugins/hello_world/lib/hello_world.rb
  10. invoketest_unit
  11. insidevendor/plugins/hello_world
  12. createtest
  13. createtest/hello_world_test.rb
  14. createtest/test_helper.rb

这里面比较重要的文件就是init.rb和lib/hello_world.rb,在插件被加载时,init.rb会先被加载,完成初始化,lib下放实现代码库。

第二步,编辑lib下的hello_world.rb文件,定义一个实现输出Hello World的方法say

hello_world.rb:

Ruby代码 收藏代码
  1. moduleHelloWorld
  2. defsay
  3. p'HelloWorld!'
  4. end
  5. end

第三步,插件完成了,下面在model中使用这个插件。在init.rb文件里加入

init.rb:

Ruby代码 收藏代码
  1. ActiveRecord::Base.send(:include,HelloWorld)

这样就为所有的model都混入了HelloWorld,say方法也就成了model里的实例方法了。


这样就在ActiveRcord:Base里混入了HelloWorld模块,而model又是继承于ActiveRecord::Base,所以model就能直接调用HelloWorld中的静态方法了。
send所发送的消息,在程序运行时是可变的,而且,send还能打开module或类中的private方法,使用上更加灵活。


在model中使用,post.rb:

Ruby代码 收藏代码
  1. classPost<ActiveRecord::Base
  2. end

在控制台中看一下结果:

Shell代码 收藏代码
  1. 1.8.7:001>Post.new.say
  2. "HelloWorld!"
  3. =>nil

没有问题!一个简单的插件就完成了,但这样HelloWorld里的方法对所有的model都是打开的,如果不想这样,可以这样这样写

hello_world.rb:

Ruby代码 收藏代码
  1. moduleHelloWorld
  2. defself.included(base)
  3. base.extend(ClassMethods)
  4. end
  5. moduleClassMethods
  6. defhellolize
  7. includeHelloWorld::InstanceMethods
  8. end
  9. end
  10. moduleInstanceMethods
  11. defsay
  12. p'HelloWorld!'
  13. end
  14. end
  15. end

当HelloWorld模块被include时,方法included将被调用,混含的类的名字被传入,再调用了extend方法,ClassMethods模块中的方法就成了混入类中的类方法了,就可以直接调用了。当hellolize方法被调用时,InstanceMethods就被混入类中了,成了混入类中的实例方法了。这样做的好处是,我想在哪个model里便用say方法,就在哪个model里调用hellolize方法,这样做保证了方法的安全性


init.rb:

Ruby代码 收藏代码
  1. ActiveRecord::Base.send(:include,HelloWorld)


在model中使用,post.rb:

Ruby代码 收藏代码
  1. classPost<ActiveRecord::Base
  2. hellolize
  3. end

在控制台中看一下结果:

Shell代码 收藏代码
  1. 1.8.7:001>Post.new.say
  2. "HelloWorld!"
  3. =>nil

以上只是一个实现过程,可以根据实际情况把重复功能代码写成插件使用。

当然,一个完整的插件有完整的验证和测试,此例子纯粹供练手,仅供参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值