【发布时间】:2014-03-14 23:20:51
【问题描述】:
我尝试根据 Railscast Episode 033 Making a Plugin 创建一个 Ruby Gem。我创建了 gem 并以 stringify-time 的身份上传到 Rubygems.org,但 setter 方法不起作用。
宝石的主要部分
module StringifyTime
def stringify_time(*names)
names.each do |name|
define_method "#{name}_string" do
read_attribute(name).to_s(:db) unless read_attribute(name).nil?
end
define_method "#{name}_string=" do |time_str|
begin
write_attribute("#{name}", Time.zone.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
ActiveRecord::Base.send(:extend, StringifyTime)
传入一个属性符号并创建getter 和setter 方法。 getter 方法有效,但是当我尝试通过表单更新属性时,数据没有保存。
在Task模型中使用stringify_time方法
class Task < ActiveRecord::Base
validates_presence_of :name
stringify_time :due_at
# def due_at_string
# due_at.to_s(:db)
# end
# def due_at_string=(due_at_str)
# self.due_at = Time.parse(due_at_str)
# rescue ArgumentError
# @due_at_invalid = true
# end
def validate
errors.add :due_at, 'is invalid' if due_at_invalid? # @due_at_invalid
end
end
当我取消注释我手动编写的setter方法时,我可以编辑属性。
【问题讨论】:
-
您是否尝试过从 Rails 控制台测试生成的方法?另外,生成的方法和手写的方法还是有很大区别的。
标签: ruby-on-rails ruby activerecord gem