如何实现一个简单的插件?下面实现一个在model中能输出hello world的插件。
注:()中的斜体是本人的心得体会,可忽略。
第一步,在工程目录下新建一个插件,运行
rails generate plugin HelloWorld
这个命令会生成以下目录文件:
create vendor/plugins/hello_world
create vendor/plugins/hello_world/MIT-LICENSE
create vendor/plugins/hello_world/README
create vendor/plugins/hello_world/Rakefile
create vendor/plugins/hello_world/init.rb
create vendor/plugins/hello_world/install.rb
create vendor/plugins/hello_world/uninstall.rb
create vendor/plugins/hello_world/lib
create vendor/plugins/hello_world/lib/hello_world.rb
invoke test_unit
inside vendor/plugins/hello_world
create test
create test/hello_world_test.rb
create test/test_helper.rb
这里面比较重要的文件就是init.rb和lib/hello_world.rb,在插件被加载时,init.rb会先被加载,完成初始化,lib下放实现代码库。
第二步,编辑lib下的hello_world.rb文件,定义一个实现输出Hello World的方法say
hello_world.rb:
module HelloWorld
def say
p 'Hello World!'
end
end
第三步,插件完成了,下面在model中使用这个插件。在init.rb文件里加入
init.rb:
ActiveRecord::Base.send(:include, HelloWorld)
这样就为所有的model都混入了HelloWorld,say方法也就成了model里的实例方法了。
(这样就在ActiveRcord:Base里混入了HelloWorld模块,而model又是继承于ActiveRecord::Base,所以model就能直接调用HelloWorld中的静态方法了。
send所发送的消息,在程序运行时是可变的,而且,send还能打开module或类中的private方法,使用上更加灵活。)
在model中使用,post.rb:
class Post < ActiveRecord::Base
end
在控制台中看一下结果:
1.8.7 :001 > Post.new.say
"Hello World!"
=> nil
没有问题!一个简单的插件就完成了,但这样HelloWorld里的方法对所有的model都是打开的,如果不想这样,可以这样这样写
hello_world.rb:
module HelloWorld
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def hellolize
include HelloWorld::InstanceMethods
end
end
module InstanceMethods
def say
p 'Hello World!'
end
end
end
(当HelloWorld模块被include时,方法included将被调用,混含的类的名字被传入,再调用了extend方法,ClassMethods模块中的方法就成了混入类中的类方法了,就可以直接调用了。当hellolize方法被调用时,InstanceMethods就被混入类中了,成了混入类中的实例方法了。这样做的好处是,我想在哪个model里便用say方法,就在哪个model里调用hellolize方法,这样做保证了方法的安全性)
init.rb:
ActiveRecord::Base.send(:include, HelloWorld)
在model中使用,post.rb:
class Post < ActiveRecord::Base
hellolize
end
在控制台中看一下结果:
1.8.7 :001 > Post.new.say
"Hello World!"
=> nil
以上只是一个实现过程,可以根据实际情况把重复功能代码写成插件使用。
当然,一个完整的插件有完整的验证和测试,此例子纯粹供练手,仅供参考。
这里有个比较好的例子:http://railscasts.com/episodes/33-making-a-plugin?view=asciicast
分享到:
相关推荐
基于Edge Rails运行的CRUD2 博文链接:https://mmm.iteye.com/blog/116934
Ruby on Rails非常强大,但是它不能做所有的事情。有许多特性太过实践化,超出了Rails核心的范畴,或者与Rails的设计理念相左太甚(毕竟Rails是个人理念的软件)。核心团队不能也不会将人们想要的任何东西都包含到...
rails.vim提供了常用的一些命令,可以帮助开发,例如:Rgenerate, Rake, Rfind,RTview等,很方便,也很实用。 安装方法: 拷贝 autoload/rails.vim, plugin/rails.vim, 和 doc/rails.txt 到 ~/.vim 目录. ...
userstamp, 这个 Rails 插件扩展ActiveRecord Userstamp插件( v-2.0 )概述Userstamp插件扩展了 ActiveRecord::Base,以添加对'创建者','更新程序'和'deleter'属性的自动更新。 它是基于 ActiveRecord::Timesta
rails_amp, RailsAmp是( 加速移动页面)的Ruby on Rails 插件 RailsAmp RailsAmp是一个 Ruby on Rails 插件,可以轻松构建( 加速移动页面) 视图。支持版本Rails 4.1,4.2,5.0安装在你的Gemfile中:gem 'rails_amp'
oauth-plugin, 用于OAuth的Rails 插件 OAuth插件这是在 Rails 应用程序中实现OAuth提供者和消费者的插件。我们支持修改后的OAuth 1.0规格:tools.ietf. org/html/rfc5849以及对 OAuth 2.0的支持:tools.iet
facebooker, facebooker Rails 插件 Facebookerfacebooker.rubyforge.org描述:Facebooker是在 Facebook REST API 上的一个 ruby 包装器。 它的目标是:惯用 ruby在 ruby 标准库
ruby on rails for eclipse开发插件
eclipse 支持ruby on rails开发的插件
tiny_mce, Ruby on Rails 插件( pre Rails 3.1 ),允许你轻松地将TinyMCE编辑器实现到你的应用程序中 用于 Rails的 TinyMCE因为我没有时间维护它,而且代码库处于不一致状态,所以这个 gem 被折旧 ! 似乎如下笔记。...
Declarative Authorization - 一个授权Rails插件,在同一个地方使用声明式DSL用于指定授权规则
博文链接:https://moyuan.iteye.com/blog/221185
rack-offline, 用于构建脱机web应用程序的rack 和 Rails 插件 HTML5离线HTML5提供了两种在流行的移动设备( 如iPhone和 Android ) 以及基于 webkit 和on的现代桌面浏览器实现。用法使用 Rack::Offline 最简单的方法是...
ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate 即可实现非常易用的持久化,Github 和 Rubygems 上丰富多样的 Rails 插件是 Rails 开发高效率的又一有力保障。Rails 是一个真正彻底的 MVC(Model-View-...
yaml_db, 用于数据库独立转储格式的Rails 插件,data.yml YamlDbYamlDb是用于转储和还原数据的数据库独立格式。 它补充了数据库/模式中发现的数据库独立模式格式。 数据保存到数据库/数据。yml 。这可以以用作一个...
Rails 的英文脏话过滤器 这个插件将允许您使用基本替换或字典术语过滤亵渎。
Session管理、用户登录和认证系统,XML和ActiveResource,后台处理和ActionMaile,测试和specs(包括RSpec on Rails和Selenium),安装、管理、编写插件,Rails的生产部署、配置和Capistrano等内容。 《Rails之道》...
该插件可以方便地与Spgateway集成 - 台湾的在线支付服务。
这个扩展允许您创建任何自定义形状的轨道,然后将一个购物车附加到它,并实际骑在轨道上。让平台在受到撞击时能滑动,地铁列车撞到障碍物,坏掉的电梯,过山车,看不见的飞行路线,火箭推进的火车等等!...
NULL 博文链接:https://hlee.iteye.com/blog/587006