诗歌rails之make a plugin
我们可以将Task类里的due_at_string这个虚拟属性的生成做成一个plugin:
这将在vendor/plugins目录生成如下文件:
我们来修改如下文件:
init.rb:
stringify_time.rb:
OK,我们可以来在Task类中使用我们刚才创建的插件了:
- ruby script/generate plugin stringify_time
- 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
- 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
- class Task < ActiveRecord::Base
- stringify_time :due_at
- def validate
- errors.add(:due_at, "is invalid") if due_at_invalid?
- end
- end
莫愁前路无知己,天下无人不识君。