module GlobalID::Locator
Public Instance Methods
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
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
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
# 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
# File lib/global_id/locator.rb, line 59 def locator_for(gid) @locators.fetch(normalize_app(gid.app)) { default_locator } end
# File lib/global_id/locator.rb, line 67 def normalize_app(app) app.to_s.downcase end