诗歌rails之make a plugin

我们可以将Task类里的due_at_string这个虚拟属性的生成做成一个plugin:
ruby代码
  1. ruby script/generate plugin stringify_time  
这将在vendor/plugins目录生成如下文件:
ruby代码
  1. vendor  
  2.  plugins  
  3.   stringify_time  
  4. ---init.rb  
  5. ---install.rb  
  6.    lib  
  7. ----stringify_time.rb  
  8. ---Rakefile  
  9. ---README  
  10.    tasks  
  11.    test  
  12. ---uninstall.rb  
我们来修改如下文件:
init.rb:
ruby代码
  1. require 'stringify_time'  
  2.   
  3. class ActiveRecord::Base  
  4.   extend StringifyTime  
  5. end  
stringify_time.rb:
ruby代码
  1. module StringifyTime  
  2.   def stringify_time(*names)  
  3.     names.each do |name|  
  4.       define_method "#{name}_string" do  
  5.         read_attribute(name).to_s(:db)  
  6.       end  
  7.   
  8.       define_method "#{name}_string=" do |time_str|  
  9.         begin  
  10.           write_attribute(name, Time.parse(time_str))  
  11.         rescue ArgumentError  
  12.           instance_variable_set("@#{name}_invalid"true)  
  13.         end  
  14.       end  
  15.   
  16.       define_method "#{name}_invalid?" do  
  17.         instance_variable_get("@#{name}_invalid")  
  18.       end  
  19.     end  
  20.   end  
  21. end  
OK,我们可以来在Task类中使用我们刚才创建的插件了:
ruby代码
  1. class Task < ActiveRecord::Base  
  2.   stringify_time :due_at  
  3.   
  4.   def validate  
  5.     errors.add(:due_at, "is invalid"if due_at_invalid?  
  6.   end  
  7. end  
posted @ 2009-07-08 10:56  麦飞  阅读(149)  评论(0编辑  收藏  举报