我有这个模块,它包含在一个类中:
module MyModule
def self.included base
base.extend ClassMethods
end
module ClassMethods
def my_module_method data
include MyModule::InstanceMethods
after_save :my_module_process
attr_accessor :shared_data
shared_data = data
# instance_variable_set :@shared_data, data
end
end
module InstanceMethods
private
def my_module_process
raise self.shared_data.inspect
# raise instance_variable_get(:@shared_data).inspect
end
end
end
我想使用data
中传递给my_module_method
的{{1}}(参数)。我使用了my_module_process
以及实例变量,但其中任何一个都返回attr_accessor
。
答案 0 :(得分:2)
由于您正在使用rails,因此可以通过将其模块化为AS :: Concern来大大简化模块
module MyModule
extend ActiveSupport::Concern
included do
# after_save :my_module_process # or whatever
cattr_accessor :shared_data
end
module ClassMethods
def my_module_method(data)
self.shared_data = data
end
end
def my_module_process
"I got this shared data: #{self.class.shared_data}"
end
end
这里的关键点是:
cattr_accessor
,类似于attr_accessor
,但定义了类级方法self.class.shared_data
从实例访问该类级数据。用法:
class Foo
include MyModule
end
f = Foo.new
f.my_module_process # => "I got this shared data: "
Foo.my_module_method({foo: 'bar'})
f.my_module_process # => "I got this shared data: {:foo=>\"bar\"}"
我使用过attr_accessor以及实例变量,但其中任何一个都返回nil。
在红宝石中,知道在任何特定时刻self
是什么是非常重要的。这是定义可用的方法和实例变量的原因。作为练习,我建议你找出为什么user.name
在这里返回nil(以及如何修复它)。
class User
@name = 'Joe'
def name
@name
end
end
user = User.new
user.name # => nil