Skip to content

Instantly share code, notes, and snippets.

@drewdeponte
Created January 9, 2012 03:57
Show Gist options
  • Save drewdeponte/1580975 to your computer and use it in GitHub Desktop.
Save drewdeponte/1580975 to your computer and use it in GitHub Desktop.
generate_from_segments
def generate_from_segments(segments, params, merged, options, optional = false)
if optional
return EMPTY_STRING if segments.all? { |s| s.is_a?(String) }
return EMPTY_STRING unless segments.flatten.any? { |s|
params.has_key?(s.name) if s.is_a?(DynamicSegment)
}
return EMPTY_STRING if segments.any? { |segment|
if segment.is_a?(DynamicSegment)
value = merged[segment.name] || @defaults[segment.name]
value = parameterize(segment.name, value, options)
merged_value = parameterize(segment.name, merged[segment.name], options)
default_value = parameterize(segment.name, @defaults[segment.name], options)
if value.nil? || segment !~ value
true
elsif merged_value == default_value
# Nasty control flow
return :clear_remaining_segments
else
false
end
end
}
end
generated = segments.map do |segment|
case segment
when String
segment
when DynamicSegment
puts "DREW: dynamic segment"
value = params[segment.name] || merged[segment.name] || @defaults[segment.name]
value = parameterize(segment.name, value, options)
if value && segment =~ value.to_s
value
else
return
end
when Array
value = generate_from_segments(segment, params, merged, options, true)
if value == :clear_remaining_segments
segment.each { |s| params.delete(s.name) if s.is_a?(DynamicSegment) }
EMPTY_STRING
elsif value.nil?
EMPTY_STRING
else
value
end
end
end
# Delete any used items from the params
segments.each { |s| params.delete(s.name) if s.is_a?(DynamicSegment) }
generated.join
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment