module GlobalID::Locator

Public Instance Methods

locate(gid, options = {}) click to toggle source

Takes either a GlobalID or a string that can be turned into a GlobalID

Options:

  • :only - A class, module or Array of classes and/or modules that are allowed to be located. Passing one or more classes limits instances of returned classes to those classes or their subclasses. Passing one or more modules in limits instances of returned classes to those including that module. If no classes or modules match, nil is returned.

# File lib/global_id/locator.rb, line 12
def locate(gid, options = {})
  if gid = GlobalID.parse(gid)
    locator_for(gid).locate gid if find_allowed?(gid.model_class, options[:only])
  end
end
locate_signed(sgid, options = {}) click to toggle source

Takes either a SignedGlobalID or a string that can be turned into a SignedGlobalID

Options:

  • :only - A class, module or Array of classes and/or modules that are allowed to be located. Passing one or more classes limits instances of returned classes to those classes or their subclasses. Passing one or more modules in limits instances of returned classes to those including that module. If no classes or modules match, nil is returned.

# File lib/global_id/locator.rb, line 26
def locate_signed(sgid, options = {})
  SignedGlobalID.find sgid, options
end
use(app, locator = nil, &locator_block) click to toggle source

Tie a locator to an app. Useful when different apps collaborate and reference each others' Global IDs.

The locator can be either a block or a class.

Using a block:

GlobalID::Locator.use :foo do |gid|
  FooRemote.const_get(gid.model_name).find(gid.model_id)
end

Using a class:

GlobalID::Locator.use :bar, BarLocator.new

class BarLocator
  def locate(gid)
    @search_client.search name: gid.model_name, id: gid.model_id
  end
end
# File lib/global_id/locator.rb, line 50
def use(app, locator = nil, &locator_block)
  raise ArgumentError, 'No locator provided. Pass a block or an object that responds to #locate.' unless locator || block_given?

  GlobalID.validate_app(app)

  @locators[normalize_app(app)] = locator || BlockLocator.new(locator_block)
end

Private Instance Methods

find_allowed?(model_class, only = nil) click to toggle source
# File lib/global_id/locator.rb, line 63
def find_allowed?(model_class, only = nil)
  only ? Array(only).any? { |c| model_class <= c } : true
end
locator_for(gid) click to toggle source
# File lib/global_id/locator.rb, line 59
def locator_for(gid)
  @locators.fetch(normalize_app(gid.app)) { default_locator }
end
normalize_app(app) click to toggle source
# File lib/global_id/locator.rb, line 67
def normalize_app(app)
  app.to_s.downcase
end