module ActionView::Helpers::UrlHelper

def to_form_params(attribute, namespace = nil)

# => [{name: 'country[name]', value: 'Denmark'}]
to_form_params({ name: 'Denmark' }, 'country')

An optional namespace can be passed to enclose key names:

# => [{name: 'countries[]', value: 'Denmark'}, {name: 'countries[]', value: 'Sweden'}]
to_form_params(countries: ['Denmark', 'Sweden']})

# => [{name: 'country[name]', value: 'Denmark'}]
to_form_params(country: { name: 'Denmark' })

# => [{name: 'name', value: 'David'}, {name: 'nationality', value: 'Danish'}]
to_form_params(name: 'David', nationality: 'Danish')

suitable for use as the names and values of form input fields:
Returns an array of hashes each containing :name and :value keys
def to_form_params(attribute, namespace = nil)
  attribute = if attribute.respond_to?(:permitted?)
    attribute.to_h
  else
    attribute
  end
  params = []
  case attribute
  when Hash
    attribute.each do |key, value|
      prefix = namespace ? "#{namespace}[#{key}]" : key
      params.push(*to_form_params(value, prefix))
    end
  when Array
    array_prefix = "#{namespace}[]"
    attribute.each do |value|
      params.push(*to_form_params(value, array_prefix))
    end
  else
    params << { name: namespace.to_s, value: attribute.to_param }
  end
  params.sort_by { |pair| pair[:name] }
end