在方法之间共享数据

时间:2017-10-13 16:53:49

标签: ruby-on-rails ruby instance-variables attr-accessor

我有这个模块,它包含在一个类中:

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

1 个答案:

答案 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