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

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

生成plugin骨架代码:

Ruby代码
  1. ruby scriptgenerate plugin MyPlugin  
ruby scriptgenerate 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.     
  4.   def to_xml  
  5.     export_to_xml  
  6.   end  
  7. end  
class BlogController < ApplicationControllermy_plugin :postdef to_xmlexport_to_xmlend
end


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

生成plugin
Ruby代码
  1. ruby scriptgenerate plugin MyPlugin  
ruby scriptgenerate plugin MyPlugin
and than to find:

vendor/plugins/my_plugin/lib/my_plugin.rb

接着就是edit了:

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

更多相关:

  • 第一种方式:将依赖包打包进一个jar包中。 maven-compiler-plugin1.81.8${projec...

  • 1.搭建普通三层 DAL层,BLL层,Model层,Web层; DAL层引用Model层 BLL层引用DAL层和Model层 Web层引用BLL层和Model层 2.实现EF三层的搭建(添加引用,修改配置信息) 2.1添加EF对象 在Model中添加一个ADO.NET实体数据集 2.2添加引用信息 在DAL层中添加引用,Ent...

  • CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); //在这写入要计算时间的代码 // do something CFAbsoluteTime end = CFAbsoluteTimeGetCurrent(); NSLog(@"%f", end - start); 转载于:ht...

  • Given a sorted integer array without duplicates, return the summary of its ranges. For example, given [0,1,2,4,5,7], return ["0->2","4->5","7"]. 代码要求对数组中的元素进行分段。 首先给...

  • Hello,此BAT脚本能够帮助开发者将某目录下全部SQL脚本按文件名称依次在指定数据库中批量执行。不用忍受powershell invoke-sqlcmd 的笨重。在指执行时多一种选择。 bat文件 @echo off @REM ******** ******** General Batch for Starting SQL...

  • Description 设有一个n×m(小于100)的方格(如图所示),在方格中去掉某些点,方格中的数字代表距离(为小于100的数,如果为0表示去掉的点),试找出一条从A(左上角)到B(右下角)的路径,经过的距离和为最小(此时称为最小代价),从A出发的方向只能向右,或者向下。 Sample Input 4 4 4 10 7 0...

  • 有些Windows聚焦图片确实很漂亮,很希望保留下来,但是Windows聚焦图片总更好,网上有得到聚焦图片的方法,每次都手动去弄真麻烦,于是自己编了一个小程序,自动得到Windows聚焦图片,下面是运行这个小程序得到Windows聚焦图片的效果! 小工具以及源码下载:http://download.csdn.net/detail/su...