# 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 # 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), :alpha2, :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, :alpha2, :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