# CountrySelect
module ActionView
module Helpers
module FormOptionsHelper
# Return select and option tags for the given object and method, using country_options_for_select to generate the list of option tags.
def country_select(object, method, priority_countries = nil, options = {}, html_options = {})
InstanceTag.new(object, method, self, options.delete(:object)).to_country_select_tag(priority_countries, options, html_options)
end
# Return select and option tags for the given object and method, using country_options_for_select to generate the list of option tags.
def teritory_select(object, method, priority_territories = nil, options = {}, html_options = {})
InstanceTag.new(object, method, self, options.delete(:object)).to_territory_select_tag(priority_territories, options, html_options)
end
# Returns a string of option tags for pretty much any country in the world. Supply a country name as +selected+ to
# have it marked as the selected option tag. You can also supply an array of countries as +priority_countries+, so
# that they will be listed above the rest of the (long) list.
#
# NOTE: Only the option tags are returned, you have to wrap this call in a regular HTML select tag.
def country_options_for_select(selected = nil, priority_countries = nil)
country_options = ""
if priority_countries
country_options += options_from_collection_for_select(Country.find(priority_countries), :alpha2, :name, selected)
country_options += "\n"
# prevents selected from being included twice in the HTML which causes
# some browsers to select the second selected option (not priority)
# which makes it harder to select an alternative priority country
selected = nil if priority_countries.include?(selected)
end
country_options + options_from_collection_for_select(Uncharted::Country.countries, :alpha2, :name, selected)
end
def territory_options_for_select(selected = nil, priority_territories = nil)
territory_options = ""
if priority_territories
territory_options += options_from_collection_for_select(Territory.find(priority_territories), :code, :name, selected)
territory_options += "\n"
# prevents selected from being included twice in the HTML which causes
# some browsers to select the second selected option (not priority)
# which makes it harder to select an alternative priority country
selected = nil if priority_territories.include?(selected)
end
territory_options + options_from_collection_for_select(Uncharted::Country.territories, :code, :name, selected)
end
end
class InstanceTag
def to_country_select_tag(priority_countries, options, html_options)
html_options = html_options.stringify_keys
add_default_name_and_id(html_options)
value = value(object)
content_tag("select", add_options(country_options_for_select(value, priority_countries), options, value), html_options)
end
def to_territory_select_tag(priority_territories, options, html_options)
html_options = html_options.stringify_keys
add_default_name_and_id(html_options)
value = value(object)
content_tag("select", add_options(territory_options_for_select(value, priority_territories), options, value), html_options)
end
end
class FormBuilder
def country_select(method, priority_countries = nil, options = {}, html_options = {})
@template.country_select(@object_name, method, priority_countries, options.merge(:object => @object), html_options)
end
def territory_select(method, priority_territories = nil, options = {}, html_options = {})
@template.territory_select(@object_name, method, priority_territories, options.merge(:object => @object), html_options)
end
end
end
end