Class: CafeCar::HrefBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/cafe_car/href_builder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*parts, namespace: [], template: nil, **params) ⇒ HrefBuilder

Returns a new instance of HrefBuilder.



5
6
7
8
9
10
11
# File 'lib/cafe_car/href_builder.rb', line 5

def initialize(*parts, namespace: [], template: nil, **params)
  @params    = params
  @parts     = parts
  @namespace = namespace
  @template  = template
  normalize!
end

Instance Attribute Details

#namespaceObject (readonly)

Returns the value of attribute namespace.



3
4
5
# File 'lib/cafe_car/href_builder.rb', line 3

def namespace
  @namespace
end

#partsObject (readonly)

Returns the value of attribute parts.



3
4
5
# File 'lib/cafe_car/href_builder.rb', line 3

def parts
  @parts
end

Instance Method Details

#collapsed_namespaceObject



40
41
42
43
44
45
46
# File 'lib/cafe_car/href_builder.rb', line 40

def collapsed_namespace
  0.upto(@namespace.size) do |i|
    if parts_start_with? @namespace.drop(i)
      return @namespace.slice(0, i)
    end
  end
end

#expanded_partsObject



48
49
50
# File 'lib/cafe_car/href_builder.rb', line 48

def expanded_parts
  @expanded_parts ||= @parts.flat_map { expand_part _1 }
end

#normalize!Object



32
33
34
35
36
37
38
# File 'lib/cafe_car/href_builder.rb', line 32

def normalize!
  @parts.flatten!
  @params.with_defaults!(@parts.extract_options!)
  @namespace = @namespace.underscore.split(?/).map(&:to_sym) if @namespace.is_a? String
  @params.delete(:action) if @params[:action].in? %i[show destroy index]
  self
end

#to_sObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/cafe_car/href_builder.rb', line 13

def to_s
  case [ *@parts ]
  in [ String ]
    [ *@parts, *@params.to_query.presence ].join(??)
  in []
    @template.url_for(@params)
  else
    namespace = collapsed_namespace
    parts     = @parts.map { singular_resource(_1) }
    begin
      @template.url_for([ *namespace, *parts, @params ])
    rescue NoMethodError
      raise if namespace.empty?
      namespace.pop
      retry
    end
  end
end