Class: FriendlyRoutes::Params::CollectionParams

Inherits:
Base
  • Object
show all
Defined in:
lib/friendly_routes/params/collection_params.rb

Overview

Created to work with ActiveRecord collection

Instance Attribute Summary collapse

Attributes inherited from Base

#name, #type

Instance Method Summary collapse

Methods inherited from Base

#optional?, #refused?, #required?

Constructor Details

#initialize(name, collection, key_attr, optional: true) ⇒ CollectionParams

Returns a new instance of CollectionParams.



12
13
14
15
16
17
18
# File 'lib/friendly_routes/params/collection_params.rb', line 12

def initialize(name, collection, key_attr, optional: true)
  super(:collection, name, optional)
  @collection = collection
  @key_attr = key_attr
  check_params
  @collection_ids = collection.pluck(:id)
end

Instance Attribute Details

#collectionObject

Instance of ActiveRecord collection

Returns:

  • (Object)

    the current value of collection



9
10
11
# File 'lib/friendly_routes/params/collection_params.rb', line 9

def collection
  @collection
end

#key_attrSymbol, String

name of attribute for matching

Returns:

  • (Symbol, String)

    the current value of key_attr



9
10
11
# File 'lib/friendly_routes/params/collection_params.rb', line 9

def key_attr
  @key_attr
end

Instance Method Details

#allowed?(id_or_instance) ⇒ Boolean

Check if value can be composed

Parameters:

  • id_or_instance (Integer|Object)

    collection instance or it id

Returns:

  • (Boolean)


43
44
45
46
47
48
49
# File 'lib/friendly_routes/params/collection_params.rb', line 43

def allowed?(id_or_instance)
  if id_or_instance.is_a?(ActiveRecord::Base)
    @collection_ids.include?(id_or_instance.id)
  else
    @collection.find_by(id: id_or_instance).present?
  end
end

#compose(id_or_instance) ⇒ String

Generate request value from params

Inverse of #parse

Parameters:

  • id_or_instance (Integer|Object)

    collection instance or it id

Returns:

  • (String)

    member key attr



34
35
36
37
38
# File 'lib/friendly_routes/params/collection_params.rb', line 34

def compose(id_or_instance)
  instance = id_or_instance
  instance = @collection.find(id_or_instance) unless instance.is_a?(ActiveRecord::Base)
  instance[@key_attr]
end

#constraintsObject



20
21
22
# File 'lib/friendly_routes/params/collection_params.rb', line 20

def constraints
  Regexp.new @collection.all.map(&@key_attr).compact.map(&:downcase).join('|')
end

#parse(value) ⇒ Integer?

Parse values from request

Inverse of #compose

Parameters:

  • value (String)

    value of item key attr

Returns:

  • (Integer, nil)

    item id or nil if item not found



27
28
29
# File 'lib/friendly_routes/params/collection_params.rb', line 27

def parse(value)
  @collection.find_by(@key_attr => value).try(:id)
end