当前位置: 首页 > 编程日记 > 正文

诗歌rails之如何写一个简单的Rails Plugin

生成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

相关文章:

【通俗理解线性代数】 -- 施密特正交化与QR分解

我们介绍线性代数知识的时候&#xff0c;稍微扩展一点&#xff0c;就能演变成一个新的角度。

iOS实现tableViewCell或collectionCell中点击界面按钮跳转

//找到父类界面 - (UIViewController *)viewController { for (UIView* next [self superview]; next; next next.superview) { UIResponder *nextResponder [next nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) { return (UIViewControlle…

java web 怎么用solr_使用web过滤器增加solr后台登录验证

solr后台自带是没有登录功能的&#xff0c;默认访问地址是&#xff1a;http://localhost:8983/solr/#/(内置jetty运行)。要给sorl后台增加登录验证方法&#xff1a;1、使用web服务器的登录验证(例如jetty、tomcat)这种方式好处是不需要另外写代码&#xff0c;只需配置一下对应的…

《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并

本节书摘来自华章计算机《程序设计解题策略》一书中的第1章&#xff0c;第1.6节,作者&#xff1a;吴永辉 王建德 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.6 利用左偏树实现优先队列的合并 优先队列在程序设计竞赛中十分常见&#xff0c;在统计问题、最值问…

Jquery JQZoom Plugin 放大鏡效果 Two

Jquery JQZoom Plugin 放大鏡效果 TwoJquery1.3.2Lib下載地址:http://files.cnblogs.com/davidzhou/jquery-1.3.2.rar插件下載地址&#xff1a;http://files.cnblogs.com/davidzhou/jqzoom_v2.2.rarDemo下載地址&#xff1a;http://files.cnblogs.com/davidzhou/MagnifySol.rar…

如何建立和维护自己的“人脉”

小故事1&#xff1a; 她打开房门&#xff0c;发现自家的门口竟然多了一条死鱼&#xff0c;她感到十分晦气&#xff0c;于是马上扔到垃圾桶了&#xff0c;过了一会儿&#xff0c;又有一条死鱼躺在自家门口&#xff0c;她还是扔了。为了抓住那个做恶作剧的人&#xff0c;她选择待…

java字符串统计英文字符用什么不同_JAVA程序。输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。...

展开全部一、问题分析&#xff1a;输入32313133353236313431303231363533e58685e5aeb931333363373764一行字母&#xff0c;那么会以换行结束。所以可以存入数组&#xff0c;也可以逐个输入&#xff0c;遇到换行结束。要统计各个类的个数&#xff0c;就要逐个判断是哪个分类的。…

COMVariantType的Date类型

刚跟一个同事讨论通过CCADOConnection读取外部数据库数据的问题&#xff0c;如果读取的数据是DateTime类型&#xff0c;只能得到Date部分&#xff0c;Time部分被忽略了。查看类CCADOField的value方法找到问题所在&#xff0c;下面是MSDN上关于COMVariant的Date方法的Remark&…

《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠

本节书摘来自华章计算机《树莓派Python编程指南》一书中的第2章&#xff0c;第2.2节,作者&#xff1a;&#xff08;美&#xff09; Alex Bradbury Ben Everard更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.2 一个Python游戏&#xff1a;猫和老鼠 现在&#xff…

【通俗理解线性代数】 -- 理解行列式

本微信图文主要从几何与变换的角度介绍了行列式的意义。

solr java score_Solr 按照得分score跟指定字段相乘排序

CentOS6&period;5 mysql 5&period;5安装CentOS 6 mysql5.5安装配置 1 安装所需软件 2 安装cmake 3 tar.gz形式安装mysql 4 配置与启动 MySQL自5.5版本以后,就开始使用cmake编译工具了.tar ...access数据库select查询top时无效的解决办法access数据库select查询top时有时…

Mantis 缺陷管理系统配置与安装

搭建Mantis 缺陷管理系统 By Snooper 错误必有&#xff01;欢迎指正&#xff01; 什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written in the PHP scripting language and works with MySQL, MS SQL, and PostgreSQL datab…

【Matlab数据的可视化】自适应绘图函数fplot

今天看到fplot这个函数&#xff0c;于是乎赶快整理出来放到“Matlab数据的可视化”这个板块中&#xff0c;以便更好的完善我们的知识结构。

大数据时代涉军网络舆情引导的“5个结合”

随着信息技术发展&#xff0c;大数据构成了一种新的传播技术环境&#xff0c;重塑了网络舆情生态&#xff0c;给社会舆情体系带来了重大而深刻的变化&#xff0c;使网络舆情在整个社会舆情体系中地位更加凸显、作用更加突出。必须从维护国家政治安全的高度&#xff0c;深入探索…

java http head 请求_http请求头header、请求体body、请求行介绍

HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问服务器的时候,http请求头的所有信息都封装在这个对象中&#xff0c;通过这个对象&#xff0c;可以获取客户端请求的所有信息。http请求包含请求行/状态行、请求头、请求体。request如果是post才有请求体&a…

全球UML模型共享设计下载中心--www.euml.org上线

全球UML模型共享设计&下载中心euml.org上线euml.org是楚凡科技版权所有的公益站点&#xff0c;为全球UML用户和爱好者提供如下服务&#xff1a;1、在线UML建模工具Trufun eUML。Trufun eUML以Applet形式运行在客户的浏览器中&#xff0c;从而提供在线建模功能。2、模型共享…

你是否对它有一种责任感

它&#xff0c;指开发人员对开发出的产品&#xff1b;它是测试人员所面对的测试产品。你是否对它有一种责任感&#xff0c;是指开发人员是否对它开发出来的产品有责任感&#xff0c;为它骄傲&#xff0c;为它而开心&#xff1b;你是否对它有一种责任感&#xff0c;是指测试人员…

【机器学习】基于粒子群算法的非线性函数寻优

本微信图文介绍了基于粒子群算法的非线性函数寻优过程&#xff0c;并利用Matlab实现。

java递归排雷_C语言实现扫雷小游戏

源代码链接&#xff1a;https://github.com/Sasura321/Minesweeper扫雷游戏也算是一个简单的小项目&#xff0c;这儿是之前写的代码&#xff0c;来写成博文回顾一下。首先,代码要实现几个功能&#xff1a;第一下扫雷时&#xff0c;即使踩中了雷也不能直接炸死;扫雷时&#xff0…

任意角度旋转图片

/// <summary> /// 任意角度旋转 /// </summary> /// <param name"bmp">原始图Bitmap</param> /// <param name"angle">旋转角度</param> /// <param name"bkColor"…

如何切分用户故事

在把用户故事切分成小块&#xff0c;从而更好地利用敏捷技术时&#xff0c;很多新组建的敏捷团队都会遇到困难。 敏捷社区的成员在多篇文章中为如何有效地切分用户故事提供了指导。  当把庞大的用户故事切分成小块时&#xff0c;是否有一些一般的准则供我们遵循呢? Rachel D…

【机器学习】基于人工鱼群算法的非线性函数寻优

本微信图文介绍了人工鱼群算法的基本原理并对一元非线性函数进行极值寻优。

java9可执行jar_单个java文件打成可执行jar包

1 概述使用JDK自带的jar与java将单个java文件打成可执行jar包并运行。 当然也可以使用IDE完成&#xff0c;使用Maven只需要一个简单的package&#xff0c;但是单个文件嘛&#xff0c;没必要这么“凶狠”。2 新建测试文件著名的Hello World&#xff1a;public class Main{public…

简评游戏人工智能相关的中文书(下)

赖勇浩&#xff08;http://laiyonghao.com&#xff09; 游戏开发中的人工智能 2006 年 9 月第一版 AI for Game Develpoers 应该算得上一本质量在中等偏上的书&#xff0c;可惜的是即使中文版是由 O’Reilly Taiwan 公司编译&#xff0c;中文版的质量依然差强人意。小的翻译错误…

化敌为友 运营商组团拥抱OTT为哪般

2月15日&#xff0c;全球9大电信运营商宣布&#xff0c;成立“合作运营联盟”&#xff08;Partnering Operator Alliance&#xff09;&#xff0c;协力挖掘互联网企业为电信业带来的增长潜力。从几年前的抵御OTT进攻到如今的“合作运营”&#xff0c;这个180度的态度转变后面有…

【机器学习】基于自适应变异粒子群算法的非线性函数寻优

本微信图文详细介绍了自适应变异粒子群算法的基本原理以及在非线性函数寻优中的应用。 —————————–华丽分割线—————————— 我们免费提供本文介绍方法的源码&#xff0c;你可以私信我们领取&#xff0c;如果你在领取源码后觉得有帮助&#xff0c;希望能够转…

php fastcgi配置_IIS7.5配置php(FastCGI)- 自动配置

操作系统是 Windows 2008 R2(Windows7)&#xff0c;IIS版本是7.5&#xff0c;php版本是 php-5.3.2-Win32-VC9-x86(安装包)&#xff0c;数据库是 mysql-5.5.12-win32。具体配置步骤如下&#xff1a;1、安装IIS7.51)Windows 2008(R2)安装步骤&#xff1a;桌面左下角“服务器管理器…

silverlight之How To:设置ComboBox控件的数据源当ComboBox用来作为DataGrid的某列的编辑控件时...

DataGrid是个可编辑的列表控件&#xff0c;而且可以用已有的输入控件来作为某一列的编辑控件&#xff0c;比如用ComboBox控件来作为某列的编辑控件供用户选择数据&#xff0c;这个时候就要先设置好ComboBox控件的下拉列表项了&#xff0c;在silverlight里怎么做呢&#xff1f; …

【Matlab与线性代数】Matlab中对数组元素引用方法总结

本微信图文主要介绍了Matlab中三种对数组元素的引用方法–下标法、索引法和布尔法。

预计2020年传感器需求超一万亿个

据勒克斯研究报告&#xff0c;移动设备的激增&#xff0c;可穿戴设备的日益流行以及连接式物联网的出现促使对传感器的预期需求向一万亿推进。然而&#xff0c;为了充分发挥这些或其他产品的潜能&#xff0c;仍需对传感器进行创新&#xff0c;以满足功率消耗、敏感度、外形因素…