原创作者: hideto   阅读:892次   评论:0条   更新时间:2011-05-26    
续上式。

我们可以将Task类里的due_at_string这个虚拟属性的生成做成一个plugin:
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

我们来修改如下文件:
init.rb:
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

OK,我们可以来在Task类中使用我们刚才创建的插件了:
class Task < ActiveRecord::Base
  stringify_time :due_at

  def validate
    errors.add(:due_at, "is invalid") if due_at_invalid?
  end
end
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics