诗歌rails之make a plugin

我们可以将Task类里的due_at_string这个虚拟属性的生成做成一个plugin:
ruby代码
  1. ruby script/generate plugin stringify_time  
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  
vendor plugins stringify_time ---init.rb ---install.rb lib ----stringify_time.rb ---Rakefile ---README tasks test ---uninstall.rb 
我们来修改如下文件:
init.rb:
ruby代码
  1. require 'stringify_time'  
  2.   
  3. class ActiveRecord::Base  
  4.   extend StringifyTime  
  5. end  
require 'stringify_time' class ActiveRecord::Base extend StringifyTime 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  
module StringifyTime def stringify_time(*names) names.each do |name| define_method "#{name}_string" do read_attribute(name).to_s(:db) end define_method "#{name}_string=" do |time_str| begin write_attribute(name, Time.parse(time_str)) rescue ArgumentError instance_variable_set("@#{name}_invalid", true) end end define_method "#{name}_invalid?" do instance_variable_get("@#{name}_invalid") end end end 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  
class Task < ActiveRecord::Base stringify_time :due_at def validate errors.add(:due_at, "is invalid") if due_at_invalid? end end 

转载于:https://www.cnblogs.com/orez88/articles/1518964.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值