生成plugin骨架代码:

Ruby代码
  1. ruby script\generate plugin MyPlugin
ruby script\generate plugin MyPlugin

功能需求:
在BlogController中把所有符合条件的Post(Model)生成为xml
如果不使用插件,很easy :
in BlogController

Ruby代码
  1. def export_to_xml
  2. posts = Post.find(:all, :order => 'published_date',
  3. :conditions => ['title = ?', 'love'])
  4. send_data posts.to_xml, :type => 'text/xml; charset=UTF-8;',
  5. :disposition => "attachment; filename=posts.xml"
  6. end
def export_to_xmlposts = Post.find(:all, :order => 'published_date',:conditions => ['title = ?', 'love'])send_data posts.to_xml, :type => 'text/xml; charset=UTF-8;',:disposition => "attachment; filename=posts.xml"
end

如果使用插件,我们要求能这样:

Ruby代码
  1. class BlogController < ApplicationController
  2. my_plugin :post
  3. def to_xml
  4. export_to_xml
  5. end
  6. end
class BlogController < ApplicationControllermy_plugin :postdef to_xmlexport_to_xmlend
end

OK,立刻满足以上的要求,进入你的project:
生成plugin

Ruby代码
  1. ruby script\generate plugin MyPlugin
ruby script\generate plugin MyPlugin

and than to find:
vendor/plugins/my_plugin/lib/my_plugin.rb
接着就是edit了:

Ruby代码
  1. module MyPlugin
  2. def self.included(base)
  3. base.extend(ClassMethods)
  4. end
  5. class Config
  6. attr_reader :model
  7. attr_reader :model_id
  8. def initialize(model_id)
  9. @model_id = model_id
  10. @model = model_id.to_s.camelize.constantize
  11. end
  12. def model_name
  13. @model_id.to_s
  14. end
  15. end
  16. module ClassMethods
  17. def my_plugin(model_id = nil)
  18. model_id = self.to_s.split('::').last.sub(/Controller$/, '').pluralize.singularize.underscore unless model_id
  19. @my_plugin_config = MyPlugin::Config.new(model_id)
  20. include MyPlugin::InstanceMethods
  21. end
  22. def my_plugin_config
  23. @my_plugin_config || self.superclass.instance_variable_get('@my_plugin_config')
  24. end
  25. end
  26. module InstanceMethods
  27. def export_to_xml
  28. data = self.class.my_plugin_config.model.find(:all, :order => 'published_date', :conditions => conditions_for_collection)
  29. send_data data.to_xml, :type => 'text/xml; charset=UTF-8;',
  30. :disposition => "attachment; filename=#{self.class.my_plugin_config.model_name.pluralize}.xml"
  31. end
  32. # 在controller中覆盖此method,写入满足的条件
  33. def conditions_for_collection
  34. end
  35. end
  36. end
module MyPlugindef self.included(base)base.extend(ClassMethods)endclass Configattr_reader :modelattr_reader :model_iddef initialize(model_id)@model_id = model_id@model = model_id.to_s.camelize.constantizeenddef model_name@model_id.to_sendendmodule ClassMethodsdef my_plugin(model_id = nil)model_id = self.to_s.split('::').last.sub(/Controller$/, '').pluralize.singularize.underscore unless model_id@my_plugin_config = MyPlugin::Config.new(model_id)include MyPlugin::InstanceMethodsenddef my_plugin_config@my_plugin_config || self.superclass.instance_variable_get('@my_plugin_config')endendmodule InstanceMethodsdef export_to_xmldata = self.class.my_plugin_config.model.find(:all, :order => 'published_date', :conditions => conditions_for_collection)send_data data.to_xml, :type => 'text/xml; charset=UTF-8;',:disposition => "attachment; filename=#{self.class.my_plugin_config.model_name.pluralize}.xml"end# 在controller中覆盖此method,写入满足的条件def conditions_for_collectionendendend

OK了吗? No No No 还要让rails加载plugin,在rails应用启动时,会到vendor/plugins目录查找所有plugin,并执行其中的init.rb
那么就edit init.rb

Ruby代码
  1. ActionController::Base.class_eval do
  2. include MyPlugin
  3. end
ActionController::Base.class_eval doinclude MyPlugin
end

或edit这样:

Ruby代码
  1. require 'my_plugin'
  2. ActionController::Base.send :include, MyPlugin
require 'my_plugin'
ActionController::Base.send :include, MyPlugin

最后就按上面的需求写入controller了

转载于:https://www.cnblogs.com/orez88/articles/1550476.html

诗歌rails之如何写一个简单的Rails Plugin相关推荐

  1. 如何搭建python框架_从零开始:写一个简单的Python框架

    原标题:从零开始:写一个简单的Python框架 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 你为什么想搭建一个Web框架?我想有下面几个原因: 有一个 ...

  2. 用java做一个简单记事本_用记事本写一个简单的java程序

    用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...

  3. ipad php mysql_如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

  4. python123程序设计题说句心里话_用c++写一个简单的计算器程序

    // 050305.cpp : 定义控制台应用程序的入口点. // // 050304.cpp : 定义控制台应用程序的入口点. // //四则运算 #include "stdafx.h&q ...

  5. 用java写一个简单的区块链(下)

    用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...

  6. 怎样用java写一个简单的文件复制程序

    怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...

  7. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  8. linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手

    如何在linux下用QT写一个简单的串口调试助手 QT5串口类 在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和 ...

  9. 如何写一个简单的node.js C 扩展

    node 是由 c 编写的,核心的 node 模块也都是由 c 代码来实现,所以同样 node 也开放了让使用者编写 c 扩展来实现一些操作的窗口. 如果大家对于 require 函数的描述还有印象的 ...

最新文章

  1. 操作系统原理之磁盘调度
  2. 深入理解JVM(三)——配置参数
  3. 通过一个实际例子学习SAP UI5的控件绘制和渲染
  4. 开源重量级的流程引擎或UI引擎
  5. 几款经典好用的Android,经典实用 Android十款生活必备软件推荐
  6. C++设计模式-工厂模式
  7. 读《python核心编程2》笔记 1
  8. PHP连接mysql数据库使用方法,PHP连接MySQL数据库的操作方法
  9. liunx下安装tomcat7.0.82
  10. mvc:annotation-driven
  11. 网络显示dns服务器错误,电脑出现网络dns异常是怎么回事
  12. SCAU 8609 哈夫曼树
  13. 0基础实现微信推送天气,生日等(女朋友快乐眼)
  14. 我就是故事里面的兔子
  15. 裸辞创业失败,40岁+还能找到工作吗?好彷徨
  16. 洛谷P1244青蛙过河题解
  17. 2008年度技术奥斯卡大奖:The Crunchies 2008 现场报导
  18. 2022-2028年中国融合通信(UC) 行业市场运行格局及战略咨询研究报告
  19. 谷歌浏览器插件Automa_4.元素多选
  20. Brinson多期归因计算示例

热门文章

  1. php图片转字符程序,PHP文字转图片功能原理与实现方法分析
  2. db2case语句_DB2 常用的SQL语句
  3. 直接插入排序与希尔排序
  4. lasTools laszip.exe 点云las/laz的无损压缩/解压缩工具
  5. netcore读取json文件_.net core读取json格式的配置文件
  6. 基于点云强度的3D激光雷达与相机的外参标定
  7. 基于C++的本征图像分解(Intrinsic Image Decomposition)
  8. C语言截取指定长度子字符串方法
  9. 在Ubuntu 14.04 64bit上使用dig
  10. redisCommand接口的用法--利用hiredis库获取MGET命令的结果的坑!