модуль ActionView::Helpers::FormOptionsHelper
Предоставляет ряд методов для преобразования различных типов контейнеров в набор тегов option.
Методы collection_select, select и time_zone_select принимают параметр options, являющийся хэшем:
-
:include_blank— устанавливается в true или в строку запроса, если первый элемент опции тега select пуст. Это полезно, если для элемента select не требуется значение по умолчанию.select("post", "category", Post::CATEGORIES, {include_blank: true})может стать:
<select name="post[category]"> <option></option> <option>joke</option> <option>poem</option> </select>
Еще один распространенный случай — тег select для объекта, связанного с
belongs_to.Пример с
@post.person_id => 2:select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {include_blank: 'None'})может стать:
<select name="post[person_id]"> <option value="">None</option> <option value="1">David</option> <option value="2" selected="selected">Sam</option> <option value="3">Tobias</option> </select>
-
:prompt— устанавливается в true или строку запроса. Когда у элемента select ещё нет значения, он добавляет опцию с общим запросом — «Пожалуйста, выберите» — или заданной строкой запроса.select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {prompt: 'Select Person'})может стать:
<select name="post[person_id]"> <option value="">Select Person</option> <option value="1">David</option> <option value="2">Sam</option> <option value="3">Tobias</option> </select>
-
:index— как и другие вспомогательные функции формы,selectможет принимать опцию:index, чтобы вручную установить идентификатор, используемый в выходных данных. В отличие от других вспомогательных функций,selectожидает, что эта опция будет в параметреhtml_options.select("album[]", "genre", %w[rap rock country], {}, { index: nil })становится:
<select name="album[][genre]" id="album__genre"> <option value="rap">rap</option> <option value="rock">rock</option> <option value="country">country</option> </select>
-
:disabled— может быть одиночным значением или массивом значений, которые будут отключенными опциями в выходных данных.select("post", "category", Post::CATEGORIES, {disabled: 'restricted'})может стать:
<select name="post[category]"> <option></option> <option>joke</option> <option>poem</option> <option disabled="disabled">restricted</option> </select>
При использовании с вспомогательной функцией
collection_select,:disabledтакже может быть процедурой, определяющей опции, которые должны быть отключены.collection_select(:post, :category_id, Category.all, :id, :name, {disabled: lambda{|category| category.archived? }})Если категории «2008 stuff» и «Christmas» возвращают true при вызове метода
archived?, это вернёт:<select name="post[category_id]"> <option value="1" disabled="disabled">2008 stuff</option> <option value="2" disabled="disabled">Christmas</option> <option value="3">Jokes</option> <option value="4">Poems</option> </select>
Методы публичного экземпляра
Возвращает теги checkbox для коллекции существующих возвращаемых значений method для класса object. Значение, возвращаемое при вызове method на экземпляре object, будет выбрано. Если вызов method возвращает nil, выбор не делается.
Параметры :value_method и :text_method — методы, вызываемые для каждого элемента коллекции collection. Возвращаемые значения используются в качестве атрибута value и содержимого каждого тега checkbox соответственно. Они также могут быть любым объектом, который отвечает на call, таким как proc, который будет вызван для каждого элемента коллекции collection для получения значения/текста.
Пример структуры объекта для использования с этим методом:
class Post < ActiveRecord::Base
has_and_belongs_to_many :authors
end
class Author < ActiveRecord::Base
has_and_belongs_to_many :posts
def name_with_initial
"#{first_name.first}. #{last_name}"
end
end
Пример использования (выбор связанного автора для экземпляра Post, @post):
collection_check_boxes(:post, :author_ids, Author.all, :id, :name_with_initial)
Если @post.author_ids уже [1], это вернёт:
<input id="post_author_ids_1" name="post[author_ids][]" type="checkbox" value="1" checked="checked" /> <label for="post_author_ids_1">D. Heinemeier Hansson</label> <input id="post_author_ids_2" name="post[author_ids][]" type="checkbox" value="2" /> <label for="post_author_ids_2">D. Thomas</label> <input id="post_author_ids_3" name="post[author_ids][]" type="checkbox" value="3" /> <label for="post_author_ids_3">M. Clark</label> <input name="post[author_ids][]" type="hidden" value="" />
Также можно настроить отображение элементов, передав блок методу:
collection_check_boxes(:post, :author_ids, Author.all, :id, :name_with_initial) do |b|
b.label { b.check_box }
end
Передаваемый блоку аргумент — специальный вид билдера для этой коллекции, который может генерировать метку и checkbox для текущего элемента коллекции с правильным текстом и значением. Используя его, можно изменить порядок отображения метки и checkbox или даже использовать метку как обёртку, как в приведённом выше примере.
Методы билдера label и check_box также принимают дополнительные html-опции:
collection_check_boxes(:post, :author_ids, Author.all, :id, :name_with_initial) do |b|
b.label(class: "check_box") { b.check_box(class: "check_box") }
end
Также доступны три специальных метода: object, text и value, которые представляют текущий элемент, его методы получения текста и значения соответственно. Вы можете использовать их так:
collection_check_boxes(:post, :author_ids, Author.all, :id, :name_with_initial) do |b|
b.label(:"data-value" => b.value) { b.check_box + b.text }
end
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 710
def collection_check_boxes(object, method, collection, value_method, text_method, options = {}, html_options = {}, &block)
Tags::CollectionCheckBoxes.new(object, method, self, collection, value_method, text_method, options, html_options).render(&block)
end Возвращает теги радиокнопок для коллекции существующих возвращаемых значений method для класса object. Значение, возвращаемое при вызове method на экземпляре object, будет выбрано. Если вызов method возвращает nil, выбор не делается.
Параметры :value_method и :text_method — методы, вызываемые для каждого элемента коллекции collection. Возвращаемые значения используются в качестве атрибута value и содержимого каждого тега радиокнопки соответственно. Они также могут быть любым объектом, который отвечает на call, таким как proc, который будет вызван для каждого элемента коллекции collection для получения значения/текста.
Пример структуры объекта для использования с этим методом:
class Post < ActiveRecord::Base
belongs_to :author
end
class Author < ActiveRecord::Base
has_many :posts
def name_with_initial
"#{first_name.first}. #{last_name}"
end
end
Пример использования (выбор связанного автора для экземпляра Post, @post):
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial)
Если @post.author_id уже 1, это вернёт:
<input id="post_author_id_1" name="post[author_id]" type="radio" value="1" checked="checked" /> <label for="post_author_id_1">D. Heinemeier Hansson</label> <input id="post_author_id_2" name="post[author_id]" type="radio" value="2" /> <label for="post_author_id_2">D. Thomas</label> <input id="post_author_id_3" name="post[author_id]" type="radio" value="3" /> <label for="post_author_id_3">M. Clark</label>
Также можно настроить отображение элементов, передав блок методу:
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial) do |b|
b.label { b.radio_button }
end
Передаваемый блоку аргумент — специальный вид билдера для этой коллекции, который может генерировать метку и радиокнопку для текущего элемента коллекции с правильным текстом и значением. Используя его, можно изменить порядок отображения метки и радиокнопки или даже использовать метку как обёртку, как в приведённом выше примере.
Методы билдера label и radio_button также принимают дополнительные html-опции:
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial) do |b|
b.label(class: "radio_button") { b.radio_button(class: "radio_button") }
end
Также доступны три специальных метода: object, text и value, которые представляют текущий элемент, его методы получения текста и значения соответственно. Вы можете использовать их так:
collection_radio_buttons(:post, :author_id, Author.all, :id, :name_with_initial) do |b|
b.label(:"data-value" => b.value) { b.radio_button + b.text }
end
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 647
def collection_radio_buttons(object, method, collection, value_method, text_method, options = {}, html_options = {}, &block)
Tags::CollectionRadioButtons.new(object, method, self, collection, value_method, text_method, options, html_options).render(&block)
end Возвращает теги <select> и <option> для коллекции существующих возвращаемых значений method для класса object. Значение, возвращаемое при вызове method на экземпляре object, будет выбрано. Если вызов method возвращает nil, выбор не делается, если не включить :prompt или :include_blank в хеш options.
Параметры :value_method и :text_method — методы, вызываемые для каждого элемента коллекции collection. Возвращаемые значения используются в качестве атрибута value и содержимого каждого тега <option> соответственно. Они также могут быть любым объектом, который отвечает на call, таким как proc, который будет вызван для каждого элемента коллекции collection для получения значения/текста.
Пример структуры объекта для использования с этим методом:
class Post < ActiveRecord::Base
belongs_to :author
end
class Author < ActiveRecord::Base
has_many :posts
def name_with_initial
"#{first_name.first}. #{last_name}"
end
end
Пример использования (выбор связанного автора для экземпляра Post, @post):
collection_select(:post, :author_id, Author.all, :id, :name_with_initial, prompt: true)
Если @post.author_id уже 1, это вернёт:
<select name="post[author_id]"> <option value="">Please select</option> <option value="1" selected="selected">D. Heinemeier Hansson</option> <option value="2">D. Thomas</option> <option value="3">M. Clark</option> </select>
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 201
def collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})
Tags::CollectionSelect.new(object, method, self, collection, value_method, text_method, options, html_options).render
end Возвращает теги <select>, <optgroup> и <option> для коллекции существующих возвращаемых значений method для класса object. Значение, возвращаемое при вызове method на экземпляре object, будет выбрано. Если вызов method возвращает nil, выбор не делается, если не включить :prompt или :include_blank в хеш options.
Параметры:
-
object— Экземпляр класса, используемый для тега select -
method— Атрибутobjectсоответствующий тегу select -
collection— Массив объектов, представляющих теги<optgroup> -
group_method— Имя метода, который, при вызове на элементеcollection, возвращает массив дочерних объектов, представляющих теги<option> -
group_label_method— Имя метода, который, при вызове на элементеcollection, возвращает строку, используемую в качестве атрибутаlabelдля его тега<optgroup> -
option_key_method— Имя метода, который, при вызове на дочернем объекте элементаcollection, возвращает значение, используемое в качестве атрибутаvalueдля его тега<option> -
option_value_method— Имя метода, который, при вызове на дочернем объекте элементаcollection, возвращает значение, используемое в качестве содержимого его тега<option>
Пример структуры объекта для использования с этим методом:
class Continent < ActiveRecord::Base has_many :countries # attribs: id, name end class Country < ActiveRecord::Base belongs_to :continent # attribs: id, name, continent_id end class City < ActiveRecord::Base belongs_to :country # attribs: id, name, country_id end
Пример использования:
grouped_collection_select(:city, :country_id, @continents, :countries, :name, :id, :name)
Возможный результат:
<select name="city[country_id]">
<optgroup label="Africa">
<option value="1">South Africa</option>
<option value="3">Somalia</option>
</optgroup>
<optgroup label="Europe">
<option value="7" selected="selected">Denmark</option>
<option value="2">Ireland</option>
</optgroup>
</select> # File actionview/lib/action_view/helpers/form_options_helper.rb, line 257
def grouped_collection_select(object, method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
Tags::GroupedCollectionSelect.new(object, method, self, collection, group_method, group_label_method, option_key_method, option_value_method, options, html_options).render
end Возвращает строку с тегами <option>, как options_for_select, но обернёт их тегами <optgroup>.
grouped_options = [
['North America',
[['United States','US'],'Canada']],
['Europe',
['Denmark','Germany','France']]
]
grouped_options_for_select(grouped_options)
grouped_options = {
'North America' => [['United States','US'], 'Canada'],
'Europe' => ['Denmark','Germany','France']
}
grouped_options_for_select(grouped_options)
Возможный результат:
<optgroup label="North America"> <option value="US">United States</option> <option value="Canada">Canada</option> </optgroup> <optgroup label="Europe"> <option value="Denmark">Denmark</option> <option value="Germany">Germany</option> <option value="France">France</option> </optgroup>
Параметры:
-
grouped_options— Принимает вложенный массив или хэш строк. Первое значение служит меткой<optgroup>, а второе значение должно быть массивом опций. Второе значение может быть вложенным массивом пар текст-значение. См.options_for_selectдля получения дополнительной информации.Ex. ["North America",[["United States","US"],["Canada","CA"]]]
-
selected_key— Значение, равное атрибутуvalueдля одного из тегов<option>, у которого будет установлен атрибутselected. Примечание: Это значение может соответствовать нескольким опциям, так как у вас может быть одна и та же опция в нескольких группах. В таком случае каждой из них будет назначено значениеselected="selected".
Опции:
-
:prompt— устанавливается в true или строку запроса. Когда у элемента select ещё нет значения, он добавляет опцию с общим запросом — «Пожалуйста, выберите» — или переданной строкой запроса. -
:divider— разделитель для групп опций.grouped_options = [ [['United States','US'], 'Canada'], ['Denmark','Germany','France'] ] grouped_options_for_select(grouped_options, nil, divider: '---------')
Возможный результат:
<optgroup label="---------"> <option value="US">United States</option> <option value="Canada">Canada</option> </optgroup> <optgroup label="---------"> <option value="Denmark">Denmark</option> <option value="Germany">Germany</option> <option value="France">France</option> </optgroup>
Примечание: Возвращаются только теги <optgroup> и <option>, поэтому вам всё равно необходимо обернуть вывод в соответствующий тег <select>.
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 524
def grouped_options_for_select(grouped_options, selected_key = nil, options = {})
prompt = options[:prompt]
divider = options[:divider]
body = "".html_safe
if prompt
body.safe_concat content_tag(:option, prompt_text(prompt), value: "")
end
grouped_options.each do |container|
html_attributes = option_html_attributes(container)
if divider
label = divider
else
label, container = container
end
html_attributes = { label: label }.merge!(html_attributes)
body.safe_concat content_tag(:optgroup, options_for_select(container, selected_key), html_attributes)
end
body
end Возвращает строку тегов <option>, таких как options_from_collection_for_select, но группирует их по тегам <optgroup> на основе отношений объектов в аргументах.
Параметры:
-
collection- Массив объектов, представляющих теги<optgroup>. -
group_method- Имя метода, который, при вызове на членеcollection, возвращает массив дочерних объектов, представляющих теги<option>. -
group_label_method+ - Имя метода, который, при вызове на члене
collection, возвращает строку, используемую в качестве атрибутаlabelдля его тега<optgroup>. -
option_key_method- Имя метода, который, при вызове на дочернем объекте членаcollection, возвращает значение, используемое в качестве атрибутаvalueдля его тега<option>. -
option_value_method- Имя метода, который, при вызове на дочернем объекте членаcollection, возвращает значение, используемое в качестве содержимого его тега<option>. -
selected_key- Значение, равное атрибутуvalueдля одного из тегов<option>, у которого будет установлен атрибутselected. Соответствует значению, возвращаемому одним из вызововoption_key_method. Еслиnil, выбор не производится. Также может быть хэш, если необходимо указать значения для отключения.
Пример структуры объекта для использования с этим методом:
class Continent < ActiveRecord::Base has_many :countries # attribs: id, name end class Country < ActiveRecord::Base belongs_to :continent # attribs: id, name, continent_id end
Пример использования:
option_groups_from_collection_for_select(@continents, :countries, :name, :id, :name, 3)
Возможный результат:
<optgroup label="Africa"> <option value="1">Egypt</option> <option value="4">Rwanda</option> ... </optgroup> <optgroup label="Asia"> <option value="3" selected="selected">China</option> <option value="12">India</option> <option value="5">Japan</option> ... </optgroup>
Примечание: Возвращаются только теги <optgroup> и <option>, поэтому вам все равно необходимо обернуть результат в соответствующий тег <select>.
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 454
def option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = nil)
collection.map do |group|
option_tags = options_from_collection_for_select(
group.send(group_method), option_key_method, option_value_method, selected_key)
content_tag(:optgroup, option_tags, label: group.send(group_label_method))
end.join.html_safe
end Принимает контейнер (хэш, массив, перечисляемый объект, ваш тип) и возвращает строку тегов option. Учитывая контейнер, члены которого отвечают методам first и last (например, массив из двух элементов), “last” служит значением option, а “first” - текстом option. Хэши автоматически преобразуются в этот формат, поэтому ключи становятся “first”, а значения - “last”. Если selected указано, соответствующий “last” или элемент получит выделенный тег option. selected также может быть массивом значений, которые нужно выбрать при использовании множественного выбора.
options_for_select([["Dollar", "$"], ["Kroner", "DKK"]])
# => <option value="$">Dollar</option>
# => <option value="DKK">Kroner</option>
options_for_select([ "VISA", "MasterCard" ], "MasterCard")
# => <option>VISA</option>
# => <option selected="selected">MasterCard</option>
options_for_select({ "Basic" => "$20", "Plus" => "$40" }, "$40")
# => <option value="$20">Basic</option>
# => <option value="$40" selected="selected">Plus</option>
options_for_select([ "VISA", "MasterCard", "Discover" ], ["VISA", "Discover"])
# => <option selected="selected">VISA</option>
# => <option>MasterCard</option>
# => <option selected="selected">Discover</option>
Вы можете дополнительно указать атрибуты HTML как последний элемент массива.
options_for_select([ "Denmark", ["USA", {class: 'bold'}], "Sweden" ], ["USA", "Sweden"])
# => <option value="Denmark">Denmark</option>
# => <option value="USA" class="bold" selected="selected">USA</option>
# => <option value="Sweden" selected="selected">Sweden</option>
options_for_select([["Dollar", "$", {class: "bold"}], ["Kroner", "DKK", {onclick: "alert('HI');"}]])
# => <option value="$" class="bold">Dollar</option>
# => <option value="DKK" onclick="alert('HI');">Kroner</option>
Если вы хотите указать отключенные теги option, установите selected в хэш, где :disabled это значение или массив значений, которые нужно отключить. В этом случае вы можете использовать :selected для указания выделенных тегов option.
options_for_select(["Free", "Basic", "Advanced", "Super Platinum"], disabled: "Super Platinum") # => <option value="Free">Free</option> # => <option value="Basic">Basic</option> # => <option value="Advanced">Advanced</option> # => <option value="Super Platinum" disabled="disabled">Super Platinum</option> options_for_select(["Free", "Basic", "Advanced", "Super Platinum"], disabled: ["Advanced", "Super Platinum"]) # => <option value="Free">Free</option> # => <option value="Basic">Basic</option> # => <option value="Advanced" disabled="disabled">Advanced</option> # => <option value="Super Platinum" disabled="disabled">Super Platinum</option> options_for_select(["Free", "Basic", "Advanced", "Super Platinum"], selected: "Free", disabled: "Super Platinum") # => <option value="Free" selected="selected">Free</option> # => <option value="Basic">Basic</option> # => <option value="Advanced">Advanced</option> # => <option value="Super Platinum" disabled="disabled">Super Platinum</option>
ПРИМЕЧАНИЕ: Возвращаются только теги option, вам нужно обернуть этот вызов в стандартный тег select HTML.
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 350
def options_for_select(container, selected = nil)
return container if String === container
selected, disabled = extract_selected_and_disabled(selected).map do |r|
Array(r).map { |item| item.to_s }
end
container.map do |element|
html_attributes = option_html_attributes(element)
text, value = option_text_and_value(element).map { |item| item.to_s }
html_attributes[:selected] ||= option_value_selected?(value, selected)
html_attributes[:disabled] ||= disabled && option_value_selected?(value, disabled)
html_attributes[:value] = value
content_tag_string(:option, text, html_attributes)
end.join("\n").html_safe
end Возвращает строку тегов option, скомпилированных путем итерации по collection и присвоением результата вызова value_method в качестве значения option и text_method в качестве текста option.
options_from_collection_for_select(@people, 'id', 'name')
# => <option value="#{person.id}">#{person.name}</option>
Это часто используется внутри select_tag, например, в этом примере:
select_tag 'person', options_from_collection_for_select(@people, 'id', 'name')
Если selected задано как значение или массив значений, элемент(ы), возвращающий(е) совпадение в value_method, будет(ь) выделен(ы) тегом(ами) option.
Если selected задано как Proc, то члены коллекции, возвращающие true для анонимной функции, являются выбранными значениями.
selected также может быть хэшем, определяющим значения :selected и/или :disabled по мере необходимости.
Убедитесь, что вы указываете тот же класс, что и value_method при указании выбранных или отключенных опций. Отсутствие этого может привести к нежелательным результатам. Пример:
options_from_collection_for_select(@people, 'id', 'name', '1')
Не выберет человека с ID 1, так как 1 (целое число) не то же самое, что '1' (строка)
options_from_collection_for_select(@people, 'id', 'name', 1)
должно дать желаемые результаты.
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 393
def options_from_collection_for_select(collection, value_method, text_method, selected = nil)
options = collection.map do |element|
[value_for_collection(element, text_method), value_for_collection(element, value_method), option_html_attributes(element)]
end
selected, disabled = extract_selected_and_disabled(selected)
select_deselect = {
selected: extract_values_from_collection(collection, value_method, selected),
disabled: extract_values_from_collection(collection, value_method, disabled)
}
options_for_select(options, select_deselect)
end Создает тег select и серию содержащих тегов option для заданного объекта и метода. Текущая опция, удерживаемая объектом, будет выбрана, при условии, что объект доступен.
Существует два возможных формата для параметра choices , соответствующих выводу других хелперов:
-
Плоская коллекция (см.
options_for_select). -
Вложенная коллекция (см.
grouped_options_for_select).
Например:
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, { include_blank: true })
преобразуется в:
<select name="post[person_id]"> <option value=""></option> <option value="1" selected="selected">David</option> <option value="2">Sam</option> <option value="3">Tobias</option> </select>
предполагая, что у связанного человека ID 1.
Это можно использовать для предоставления набора стандартных опций: перед рендерингом формы создания, экземпляр новой модели назначается опциям по умолчанию и привязывается к @model_name. Обычно эта модель не сохраняется в базе данных. Вместо этого, второй объект модели создается при получении запроса на создание. Это позволяет пользователю отправлять страницу формы более одного раза с ожидаемыми результатами создания нескольких записей. Кроме того, это позволяет использовать один частичный вид для генерации элементов формы для форм редактирования и создания.
По умолчанию, post.person_id - выбранная опция. Укажите selected: value для использования другого выбора или selected: nil для оставления всех опций невыбранными. Аналогично, вы можете указать значения, которые нужно отключить в тегах option, указав опцию :disabled. Это может быть одно значение или массив значений, которые нужно отключить.
Блок может быть передан в select для настройки рендеринга тегов option. Это полезно, когда у тега option сложные атрибуты.
select(report, "campaign_ids") do
available_campaigns.each do |c|
content_tag(:option, c.name, value: c.id, data: { tags: c.tags.to_json })
end
end
Gotcha
Спецификация HTML гласит, что когда параметр multiple передаётся в select, и все опции сняты, веб-браузеры не отправляют значение на сервер. К сожалению, это создаёт проблему: если у модели User есть множество roles и есть метод доступа role_ids, и в форме, редактирующей роли пользователя, пользователь снимает все роли из поля множественного выбора role_ids, параметр role_ids не отправляется. Таким образом, любой idiom присваивания масс, как
@user.update(params[:user])
не обновил бы роли.
Чтобы предотвратить это, хелпер генерирует дополнительное скрытое поле перед каждым полем множественного выбора. Скрытое поле имеет то же имя, что и поле множественного выбора, и пустое значение.
Примечание: Клиент либо отправляет только скрытое поле (представляющее снятый множественный выбор), либо оба поля. Это означает, что результирующий массив всегда содержит пустую строку.
Если вы не хотите, чтобы хелпер генерировал это скрытое поле, вы можете указать опцию include_hidden: false.
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 162
def select(object, method, choices = nil, options = {}, html_options = {}, &block)
Tags::Select.new(object, method, self, choices, options, html_options, &block).render
end Возвращает строку тегов option для практически любого часового пояса в мире. Укажите имя часового пояса ActiveSupport::TimeZone как selected для его выделения. Вы также можете предоставить массив объектов часовых поясов ActiveSupport::TimeZone как priority_zones, чтобы они отображались выше остального (длинного) списка. (Вы можете использовать ActiveSupport::TimeZone.us_zones в качестве удобного способа получить список часовых поясов США или Regexp для выбора часовых поясов по вашему выбору)
Параметр selected должен быть либо nil, либо строкой, которая называет ActiveSupport::TimeZone.
По умолчанию, model - это константа ActiveSupport::TimeZone (которую можно получить в Active Record в виде объекта). Единственное требование заключается в том, чтобы параметр model был объектом, который отвечает на all, и возвращает массив объектов, представляющих часовые пояса.
ПРИМЕЧАНИЕ: Возвращаются только теги option, вам нужно обернуть этот вызов в стандартный тег select HTML.
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 568
def time_zone_options_for_select(selected = nil, priority_zones = nil, model = ::ActiveSupport::TimeZone)
zone_options = "".html_safe
zones = model.all
convert_zones = lambda { |list| list.map { |z| [ z.to_s, z.name ] } }
if priority_zones
if priority_zones.is_a?(Regexp)
priority_zones = zones.select { |z| z =~ priority_zones }
end
zone_options.safe_concat options_for_select(convert_zones[priority_zones], selected)
zone_options.safe_concat content_tag(:option, '-------------', value: '', disabled: true)
zone_options.safe_concat "\n"
zones = zones - priority_zones
end
zone_options.safe_concat options_for_select(convert_zones[zones], selected)
end Возвращает теги select и option для данного объекта и метода, используя time_zone_options_for_select для генерации списка тегов option.
В дополнение к параметру :include_blank , описанному выше, этот метод также поддерживает параметр :model, который по умолчанию равен ActiveSupport::TimeZone. Это может использоваться пользователями для указания другого объекта модели часовых поясов. (См. time_zone_options_for_select для получения дополнительной информации.)
Вы также можете указать массив объектов ActiveSupport::TimeZone в качестве priority_zones, чтобы они были перечислены над остальной (длинной) частью списка. (Вы можете использовать ActiveSupport::TimeZone.us_zones для удобства получения списка часовых поясов США или регулярное выражение для выбора необходимых поясов.)
Наконец, этот метод поддерживает параметр :default, который выбирает значение по умолчанию ActiveSupport::TimeZone, если часовой пояс объекта nil.
time_zone_select( "user", "time_zone", nil, include_blank: true) time_zone_select( "user", "time_zone", nil, default: "Pacific Time (US & Canada)" ) time_zone_select( "user", 'time_zone', ActiveSupport::TimeZone.us_zones, default: "Pacific Time (US & Canada)") time_zone_select( "user", 'time_zone', [ ActiveSupport::TimeZone['Alaska'], ActiveSupport::TimeZone['Hawaii'] ]) time_zone_select( "user", 'time_zone', /Australia/) time_zone_select( "user", "time_zone", ActiveSupport::TimeZone.all.sort, model: ActiveSupport::TimeZone)
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 290
def time_zone_select(object, method, priority_zones = nil, options = {}, html_options = {})
Tags::TimeZoneSelect.new(object, method, self, priority_zones, options, html_options).render
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.