诗歌rails之如何写一个简单的Rails Plugin
- ruby script\generate plugin MyPlugin
ruby script\generate plugin MyPlugin
功能需求:
在BlogController中把所有符合条件的Post(Model)生成为xml
如果不使用插件,很easy :
in BlogController
- def export_to_xml
- posts = 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
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
如果使用插件,我们要求能这样:
- class BlogController < ApplicationController
- my_plugin :post
- def to_xml
- export_to_xml
- end
- end
class BlogController < ApplicationControllermy_plugin :postdef to_xmlexport_to_xmlend
end
OK,立刻满足以上的要求,进入你的project:
生成plugin
- ruby script\generate plugin MyPlugin
ruby script\generate plugin MyPlugin
and than to find:
vendor/plugins/my_plugin/lib/my_plugin.rb
接着就是edit了:
- module MyPlugin
- def self.included(base)
- base.extend(ClassMethods)
- end
- class Config
- attr_reader :model
- attr_reader :model_id
- def initialize(model_id)
- @model_id = model_id
- @model = model_id.to_s.camelize.constantize
- end
- def model_name
- @model_id.to_s
- end
- end
- module ClassMethods
- def 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::InstanceMethods
- end
- def my_plugin_config
- @my_plugin_config || self.superclass.instance_variable_get('@my_plugin_config')
- end
- end
- module InstanceMethods
- def export_to_xml
- data = 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_collection
- end
- end
- 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
- ActionController::Base.class_eval do
- include MyPlugin
- end
ActionController::Base.class_eval doinclude MyPlugin
end
或edit这样:
- require 'my_plugin'
- 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相关推荐
- 如何搭建python框架_从零开始:写一个简单的Python框架
原标题:从零开始:写一个简单的Python框架 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 你为什么想搭建一个Web框架?我想有下面几个原因: 有一个 ...
- 用java做一个简单记事本_用记事本写一个简单的java程序
用记事本写一个简单的java程序 第一步: 安装好jdk,并设置好环境变量. 桌面-计算机(右键)-属性-高级系统设置-环境变量-path-在变量值后加上:和jdk安装路径加上(路径即为C:\Prog ...
- 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 ...
- python123程序设计题说句心里话_用c++写一个简单的计算器程序
// 050305.cpp : 定义控制台应用程序的入口点. // // 050304.cpp : 定义控制台应用程序的入口点. // //四则运算 #include "stdafx.h&q ...
- 用java写一个简单的区块链(下)
用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...
- 怎样用java写一个简单的文件复制程序
怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...
- 给 asp.net core 写一个简单的健康检查
给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...
- linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手
如何在linux下用QT写一个简单的串口调试助手 QT5串口类 在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和 ...
- 如何写一个简单的node.js C 扩展
node 是由 c 编写的,核心的 node 模块也都是由 c 代码来实现,所以同样 node 也开放了让使用者编写 c 扩展来实现一些操作的窗口. 如果大家对于 require 函数的描述还有印象的 ...
最新文章
- 操作系统原理之磁盘调度
- 深入理解JVM(三)——配置参数
- 通过一个实际例子学习SAP UI5的控件绘制和渲染
- 开源重量级的流程引擎或UI引擎
- 几款经典好用的Android,经典实用 Android十款生活必备软件推荐
- C++设计模式-工厂模式
- 读《python核心编程2》笔记 1
- PHP连接mysql数据库使用方法,PHP连接MySQL数据库的操作方法
- liunx下安装tomcat7.0.82
- mvc:annotation-driven
- 网络显示dns服务器错误,电脑出现网络dns异常是怎么回事
- SCAU 8609 哈夫曼树
- 0基础实现微信推送天气,生日等(女朋友快乐眼)
- 我就是故事里面的兔子
- 裸辞创业失败,40岁+还能找到工作吗?好彷徨
- 洛谷P1244青蛙过河题解
- 2008年度技术奥斯卡大奖:The Crunchies 2008 现场报导
- 2022-2028年中国融合通信(UC) 行业市场运行格局及战略咨询研究报告
- 谷歌浏览器插件Automa_4.元素多选
- Brinson多期归因计算示例
热门文章
- php图片转字符程序,PHP文字转图片功能原理与实现方法分析
- db2case语句_DB2 常用的SQL语句
- 直接插入排序与希尔排序
- lasTools laszip.exe 点云las/laz的无损压缩/解压缩工具
- netcore读取json文件_.net core读取json格式的配置文件
- 基于点云强度的3D激光雷达与相机的外参标定
- 基于C++的本征图像分解(Intrinsic Image Decomposition)
- C语言截取指定长度子字符串方法
- 在Ubuntu 14.04 64bit上使用dig
- redisCommand接口的用法--利用hiredis库获取MGET命令的结果的坑!