- ruby script/generate plugin stringify_time
ruby script/generate plugin stringify_time
这将在vendor/plugins目录生成如下文件:
- vendor
- plugins
- stringify_time
- ---init.rb
- ---install.rb
- lib
- ----stringify_time.rb
- ---Rakefile
- ---README
- tasks
- test
- ---uninstall.rb
vendor plugins stringify_time ---init.rb ---install.rb lib ----stringify_time.rb ---Rakefile ---README tasks test ---uninstall.rb
我们来修改如下文件:
init.rb:
- require 'stringify_time'
- class ActiveRecord::Base
- extend StringifyTime
- end
require 'stringify_time' class ActiveRecord::Base extend StringifyTime end
stringify_time.rb:
- 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
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类中使用我们刚才创建的插件了:
- class Task < ActiveRecord::Base
- stringify_time :due_at
- def validate
- errors.add(:due_at, "is invalid") if due_at_invalid?
- end
- end
class Task < ActiveRecord::Base stringify_time :due_at def validate errors.add(:due_at, "is invalid") if due_at_invalid? end end