`
suchj
  • 浏览: 147443 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何写rails插件

    博客分类:
  • ruby
阅读更多

如何实现一个简单的插件?下面实现一个在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

0
0
分享到:
评论
1 楼 coldrush 2013-04-25  
学习了,挺好

相关推荐

    Ruby on Rails插件

    Ruby on Rails插件是Rails框架的核心扩展机制,用于弥补Rails本身功能的不足,提供开发者所需的额外特性或功能。Rails插件允许开发人员自定义和增强Rails的任何部分,并且能够以封装和重用的方式与其他开发者共享。...

    [Rails 常用插件简介]CRUD Generator 2

    **Rails 常用插件简介 - CRUD Generator 2** 在Ruby on Rails框架中,开发过程中经常需要创建、读取、更新和删除(CRUD)数据。为了提高开发效率,开发者通常会使用各种插件来自动化这个过程。CRUD Generator 2就是...

    Rails插件收集

    标题“Rails插件收集”指的是关于Ruby on Rails框架的扩展插件资源的汇集。Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用的开发...

    Ruby-智付通金流的Rails插件

    Ruby-智付通金流的Rails插件是一个专门为Ruby on Rails框架设计的工具,它使得开发者能够轻松地将Spgateway这个台湾知名的在线支付服务集成到自己的应用中。这个插件简化了处理支付流程的复杂性,使得在Rails应用中...

    rails 2.0.2 分页 需另外下载插件

    这个插件允许你在Rails应用中轻松地对数据进行分页显示,提高用户体验并减轻服务器压力。 **1. will_paginate插件介绍** `will_paginate`是Rails社区中非常流行的一个分页解决方案,它提供了简洁的API和强大的功能...

    VIM的Rails编辑插件rails.vim.zip

    rails.vim提供了常用的一些命令,可以帮助开发,例如:Rgenerate, Rake, Rfind,RTview等,很方便,也很实用。 安装方法: 拷贝 autoload/rails.vim, plugin/rails.vim, 和 doc/rails.txt 到 ~/.vim 目录. ...

    userstamp, 这个 Rails 插件扩展ActiveRecord.zip

    userstamp, 这个 Rails 插件扩展ActiveRecord Userstamp插件( v-2.0 )概述Userstamp插件扩展了 ActiveRecord::Base,以添加对'创建者','更新程序'和'deleter'属性的自动更新。 它是基于 ActiveRecord::Timesta

    rails_amp, RailsAmp是( 加速移动页面)的Ruby on Rails 插件.zip

    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 插件.zip

    oauth-plugin, 用于OAuth的Rails 插件 OAuth插件这是在 Rails 应用程序中实现OAuth提供者和消费者的插件。我们支持修改后的OAuth 1.0规格:tools.ietf. org/html/rfc5849以及对 OAuth 2.0的支持:tools.iet

    关于Rails登录和验证插件http_authentication restful-authentication

    6. **Rakefile和init.rb**: Rakefile用于定义任务,如安装或更新插件,而init.rb是Rails初始化脚本,负责加载插件。 7. **版本控制(.svn)**: 这个文件可能表示插件曾使用Subversion作为版本控制系统。现代项目更...

    facebooker, facebooker Rails 插件.zip

    facebooker, facebooker Rails 插件 Facebookerfacebooker.rubyforge.org描述:Facebooker是在 Facebook REST API 上的一个 ruby 包装器。 它的目标是:惯用 ruby在 ruby 标准库

    eclipse的ruby on rails开发插件RadRails

    **Ruby on Rails 开发环境构建:Eclipse与RadRails 插件详解** 在现代软件开发领域,Ruby on Rails(简称Rails)作为一个强大的Web应用程序框架,因其简洁、高效的特性深受开发者喜爱。而Eclipse,作为一款功能强大...

    用于过滤英文脏话的 Rails 插件 gem_Ruby_代码_相关文件_下载

    5. **扩展功能**:插件可能还支持更复杂的过滤逻辑,如正则表达式匹配、忽略大小写、忽略特定上下文等。查看插件文档以获取更详细的使用指南和API。 6. **测试与调试**:在开发过程中,确保对过滤功能进行充分的...

    ruby on rails for eclipse开发插件

    ruby on rails for eclipse开发插件

    ruby on rails 常用插件下载

    在这个“ruby on rails 常用插件下载”中,提到的是一个与多线程相关的插件,可能用于提高应用程序的性能和并发处理能力。 在 Ruby on Rails 中,多线程是一种处理并发请求的方式,尤其在现代硬件支持多核处理器的...

    rails2-sample

    本章节将介绍如何安装、使用和开发自己的Rails插件。插件可以提供新的特性或增强现有功能,帮助开发者更快地完成项目。 #### 11. Debugging, Testing, and Benchmarking(调试、测试和基准测试) 高质量的软件离不...

    Rails的自动完成分页插件

    在这个场景中,我们关注的是Rails的自动完成、文件上传、分页以及上传进度管理相关的插件。让我们详细了解一下这些关键知识点: 1. **Rails 自动完成**: 自动完成是一种功能,允许用户在输入框中键入时提供预填...

Global site tag (gtag.js) - Google Analytics