我可以禁止Rails模型在模块外部访问吗?

时间:2017-01-17 21:56:45

标签: ruby-on-rails ruby ruby-on-rails-4

有没有办法让模型只有同一模块中的代码才能访问它?

类似的东西:

module SomeModule
  class SomeActiveRecordModel
    # has attribute `some_attribute`
    ...
  end
end

module SomeModule
  class SomeOtherClass
    def self.sum_of_attribute
      SomeActiveRecordModel.sum(:some_attribute)
    end
  end
end

class OutsideOfModule
  def self.sum_of_attribute
    SomeModule::SomeActiveRecordModel.sum(:some_attribute)
  end
end

SomeModule::SomeOtherClass.sum_of_attribute # works
OutsideOfModule.sum_of_attribute # raises error

2 个答案:

答案 0 :(得分:0)

简短的回答是否定的。这就是为什么

理想情况下,您希望在SomeModule中实现此功能。但是当您在其他课程中调用SomeModule::SomeOtherClass.sum_of_attribute时,您的范围为SomeModule::SomeOtherClass

SomeModule::SomeActiveRecordModel.sum(:some_attribute)
                      ||
                      \/
module SomeModule
  class SomeActiveRecordModel
    def sum(*args)
      # Here, self => SomeModule::SomeActiveRecordModel
      # That's why you won't be able to do any meta trick to the module
      # or classes in the module to identify if it's being invoked outside
    end
  end
end

所以你不知道原来的来电者是谁。

您可以通过调用堆栈来挖掘它。如果您想沿着这条路走下去,可能会发现另一个SO thread。{/ p>

答案 1 :(得分:0)

简而言之,没有。但这更多的是Ruby的方法和哲学问题。还有其他一种思考代码的方法,可以让你以更加Rubyesque的方式实现类似于你正在寻找的东西。

This answer涵盖了将事物设为私密的不同方式。