很簡單。備忘。
1 生成代碼 script/generate plugin plugin_name
2 init.rb 在運行rails前會載入,並會自動載入lib下的文件
3 寫你自己需要hook的東西
關鍵:如何讓rails能在controller或view裡面使用自己寫的東西
這裡就不需要在使用時候include file 了。
方法一: 在 init.rb 中添加
ActionView::Base.send :include, UrlEnhancerHelper
意思是吧 UrlEnhancerHelper 這個 module 包含在 ActionView::Base 裡面 。
當然這種語法也可以在自己需要的地方添加。
方法二:
module ActsAsExportable
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 acts_as_exportable(model_id = nil)
# converts Foo::BarController to 'bar' and FooBarsController to 'foo_bar'
# and AddressController to 'address'
model_id = self.to_s.split('::').last.sub(/Controller$/, '').\
pluralize.singularize.underscore unless model_id
@acts_as_exportable_config = ActsAsExportable::Config.new(model_id)
include ActsAsExportable::InstanceMethods
end
# Make the @acts_as_exportable_config class variable easily
# accessable from the instance methods.
def acts_as_exportable_config
@acts_as_exportable_config || self.superclass.\
instance_variable_get('@acts_as_exportable_config')
end
end
module InstanceMethods
def export_to_xml
data = self.class.acts_as_exportable_config.model.find(:all,
:order => 'title',
:conditions => conditions_for_collection)
send_data data.to_xml,
:type => 'text/xml; charset=UTF-8;',
:disposition => "attachment; filename=\
#{self.class.acts_as_exportable_config.model_name.pluralize}.xml"
end
# Empty conditions. You can override this in your controller
def conditions_for_collection
end
end
end
最後是常用函數
動態定義函數:
define_methods "name" , block
write_attribute
read_attribute
instance_variable_set
instance_variable_get