Spec-Zone.ru › Ruby on Rails 4.2

модуль ActionView::Helpers::FormOptionsHelper

Включенные модули:
ActionView::Helpers::TextHelper

Предоставляет ряд методов для преобразования различных типов контейнеров в набор тегов 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>

Общедоступные методы экземпляров

collection_check_boxes(object, method, collection, value_method, text_method, options = {}, html_options = {}, █) Показать исходный код
# 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
  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

Аргумент, передаваемый в блок, — это специальный вид билдера для этого набора, который может генерировать метку и флажок для текущего элемента набора с правильным текстом и значением. С его помощью можно изменить порядок отображения метки и флажка или даже использовать метку в качестве обертки, как в примере выше.

Методы билдера 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
collection_radio_buttons(object, method, collection, value_method, text_method, options = {}, html_options = {}, █) Показать исходный код
# 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

Возвращает теги радиокнопок для набора существующих возвращаемых значений 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
collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {}) Показать исходный код
# 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> и <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>
grouped_collection_select(object, method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {}) Показать исходный код
# 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

Возвращает теги <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>
grouped_options_for_select(grouped_options, selected_key = nil, options = {}) Показать исходный код
# 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_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>.

option_groups_from_collection_for_select(collection, group_method, group_label_method, option_key_method, option_value_method, selected_key = nil) Показать исходный код
# 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>, как <option>, но группирует их по тегам <optgroup> на основе отношений объектов аргументов.

Параметры:

  • collection - Массив объектов, представляющих теги <option>.

  • group_method - Имя метода, который, при вызове на элементе collection, возвращает массив дочерних объектов, представляющих теги <optgroup>.

  • 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>

Примечание: Возвращаются только теги <option> и <optgroup>, поэтому вам все равно необходимо обернуть вывод в соответствующий тег <select>.

options_for_select(container, selected = nil) Показать исходный код
# 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>. При заданном контейнере, где элементы отвечают на методы first и last (например, массив из двух элементов), «last» служат значениями options, а «first» - текстом options. Хеши автоматически преобразуются в этот формат, поэтому ключи становятся «first», а значения - «last». Если selected задано, соответствующий «last» или элемент получит тег selected. 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>, вам нужно обернуть этот вызов в обычный HTML-тег

options_from_collection_for_select(collection, value_method, text_method, selected = nil) Показать исходный код
# 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

Возвращает строку тегов <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. Отсутствие этого приведет к нежелательным результатам. Пример:

options_from_collection_for_select(@people, 'id', 'name', '1')

Не выберет человека с ID 1, потому что 1 (целое число) не равно '1' (строке)

options_from_collection_for_select(@people, 'id', 'name', 1)

должно привести к ожидаемым результатам.

select(object, method, choices = nil, options = {}, html_options = {}, &block) Показать исходный код
# 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

Создает тег select и серию содержащихся в нем тегов option для указанного объекта и метода. Выбранным будет тег 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. Обычно эта модель не сохраняется в базе данных. Вместо этого второй объект модели создается при получении запроса на создание. Это позволяет пользователю отправлять страницу формы более одного раза с ожидаемым результатом создания нескольких записей. Кроме того, это позволяет использовать один partial для генерации элементов формы как для форм редактирования, так и для форм создания.

По умолчанию, post.person_id - выбранный option. Укажите selected: value для использования другого выбора или selected: nil для снятия выделения со всех options. Аналогично, вы можете указать значения, которые должны быть отключены в тегах 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

Нюанс

Спецификация HTML гласит, что когда параметр multiple передается в select, и все options снимаются с выделения, веб-браузеры не отправляют никаких значений на сервер. К сожалению, это создает нюанс: если у модели User есть много roles и есть accessor role_ids, а в форме для редактирования ролей пользователя пользователь снимает выделение со всех ролей из поля множественного выбора role_ids, параметр role_ids не отправляется. Таким образом, любые выражения mass-assignment, такие как

@user.update(params[:user])

не обновили бы роли.

Чтобы предотвратить это, помощник генерирует дополнительное скрытое поле перед каждым полем множественного выбора. Скрытое поле имеет то же имя, что и поле множественного выбора, и пустое значение.

Примечание: Клиент отправляет либо только скрытое поле (представляющее поле множественного выбора без выбора), либо оба поля. Это означает, что полученный массив всегда содержит пустую строку.

В случае, если вы не хотите, чтобы помощник генерировал это скрытое поле, вы можете указать опцию include_hidden: false.

time_zone_options_for_select(selected = nil, priority_zones = nil, model = ::ActiveSupport::TimeZone) Показать исходный код
# 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

Возвращает строку тегов <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>, вам нужно обернуть этот вызов в обычный HTML-тег

END_OF_DOCUMENT_MARKER
time_zone_select(object, method, priority_zones = nil, options = {}, html_options = {}) Показать исходный код
# 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

Возвращает теги 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)

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API