如何寫乙個簡單的Rails Plugin

2021-08-29 15:04:12 字數 2350 閱讀 1186

rails plugin是什麼,自己google吧 :wink:

生成plugin骨架**:

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

如果使用外掛程式,我們要求能這樣:

ok,立刻滿足以上的要求,進入你的project:

生成plugin

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)

endclass config

attr_reader :model

attr_reader :model_id

def initialize(model_id)

@model_id = model_id

@model = model_id.to_s.camelize.constantize

enddef model_name

@model_id.to_s

endend

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

enddef my_plugin_config

@my_plugin_config || self.superclass.instance_variable_get('@my_plugin_config')

endend

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=#.xml"

end# 在controller中覆蓋此method,寫入滿足的條件

def conditions_for_collection

endend

end

ok了嗎? no no no 還要讓rails載入plugin,在rails應用啟動時,會到vendor/plugins目錄查詢所有plugin,並執行其中的init.rb

那麼就edit init.rb

actioncontroller::base.class_eval do

include myplugin

end

或edit這樣:

require 'my_plugin'

actioncontroller::base.send :include, myplugin

最後就按上面的需求寫入controller了 :arrow:

如何寫乙個Stack?

1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...

如何寫乙個鍊錶

有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在 資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下 1 單個節點建立...

如何寫乙個Vue元件

寫的是以.vue結尾的單檔案元件的寫法,是基於webpack構建的專案。template 模板 js 邏輯 css 樣式 每個元件都有屬於自己的模板,js和樣式。如果將乙個頁面比喻成一間房子的話,元件就是房子裡的客廳 臥室 廚房 廁所。如果把廚房單獨拿出來的話,元件又可以是刀 油煙機.等等。就是說頁...