【发布时间】:2015-03-11 04:42:30
【问题描述】:
我想像这样制作自己的 attr_accessor:
class Class
def attr_accessor_with_onchange_callback(*args, &block)
raise 'Callback block is required' unless block
args.each do |arg|
attr_name = arg.to_s
define_method(attr_name) do
self.instance_variable_get("@#{attr_name}")
end
define_method("#{attr_name}=") do |argument|
old_value = self.instance_variable_get("@#{attr_name}")
if argument != old_value
self.instance_variable_set("@#{attr_name}", argument)
self.instance_exec(attr_name, argument, old_value, &block)
end
end
end
end
end
如果我在应用初始化之前将此定义放在config/enviroment.rb 中,它会起作用。
class MyCLass < ActiveRecord::Base
attr_accessor_with_onchange_callback :some_attr do |attr_name, value, old_value|
end
但我认为它应该在 lib/ 文件夹中。如果我把这个
module ModelHelpers
class Class
def attr_accessor_with_onchange_callback(*args, &block)
raise 'Callback block is required' unless block
args.each do |arg|
attr_name = arg.to_s
define_method(attr_name) do
self.instance_variable_get("@#{attr_name}")
end
define_method("#{attr_name}=") do |argument|
old_value = self.instance_variable_get("@#{attr_name}")
if argument != old_value
self.instance_variable_set("@#{attr_name}", argument)
self.instance_exec(attr_name, argument, old_value, &block)
end
end
end
end
end
end
到lib/model_helpers.rb 和这个
require 'model_helpers'
class MyCLass < ActiveRecord::Base
include ModelHelpers
attr_accessor_with_onchange_callback :some_attr do |attr_name, value, old_value|
end
到 my_class.rb 然后我得到一个错误:undefined method attr_accessor_with_onchange_callback。
我做错了什么?
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming