Spec-Zone.ru › Ruby on Rails 6.0

класс ActionView::Helpers::FormBuilder

Родитель:
Объект

Объект FormBuilder связан с определенным объектом модели и позволяет генерировать поля, связанные с объектом модели. Объект FormBuilder передается при использовании form_for или fields_for. Например:

<%= form_for @person do |person_form| %>
  Name: <%= person_form.text_field :name %>
  Admin: <%= person_form.check_box :admin %>
<% end %>

В блоке выше, объект FormBuilder передается как переменная person_form. Это позволяет генерировать поля text_field и check_box путем указания одноименных методов, которые изменяют базовый шаблон и связывают объект модели @person с формой.

Объект FormBuilder можно рассматривать как прокси для методов модуля FormHelper. Однако этот класс позволяет вызывать методы с объектом модели, для которого создается форма.

Вы можете создать собственные пользовательские шаблоны FormBuilder, унаследовавшись от этого класса. Например:

class MyFormBuilder < ActionView::Helpers::FormBuilder
  def div_radio_button(method, tag_value, options = {})
    @template.content_tag(:div,
      @template.radio_button(
        @object_name, method, tag_value, objectify_options(options)
      )
    )
  end
end

Вышеприведенный код создает новый метод div_radio_button, который оборачивает новую радиокнопку в div. Обратите внимание, что при передаче опций, необходимо вызвать objectify_options, чтобы объект модели был правильно передан в метод. Если objectify_options не вызывается, то новый созданный помощник не будет связан с моделью.

Код div_radio_button из примера может быть использован следующим образом:

<%= form_for @person, :builder => MyFormBuilder do |f| %>
  I am a child: <%= f.div_radio_button(:admin, "child") %>
  I am an adult: <%= f.div_radio_button(:admin, "adult") %>
<% end -%>

Стандартный набор методов-помощников для построения форм расположен в атрибуте класса field_helpers.

Атрибуты

index[R]
multipart[R]
multipart?[R]
object[RW]
object_name[RW]
options[RW]

Публичные методы класса

_to_partial_path() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1651
def self._to_partial_path
  @_to_partial_path ||= name.demodulize.underscore.sub!(/_builder$/, "")
end
new(object_name, object, template, options) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1663
def initialize(object_name, object, template, options)
  @nested_child_index = {}
  @object_name, @object, @template, @options = object_name, object, template, options
  @default_options = @options ? @options.slice(:index, :namespace, :skip_default_ids, :allow_method_names_outside_object) : {}
  @default_html_options = @default_options.except(:skip_default_ids, :allow_method_names_outside_object)

  convert_to_legacy_options(@options)

  if @object_name.to_s.match(/\[\]$/)
    if (object ||= @template.instance_variable_get("@#{Regexp.last_match.pre_match}")) && object.respond_to?(:to_param)
      @auto_index = object.to_param
    else
      raise ArgumentError, "object[] naming but object param and @object var don't exist or don't respond to to_param: #{object.inspect}"
    end
  end

  @multipart = nil
  @index = options[:index] || options[:child_index]
end

Публичные методы экземпляра

button(value = nil, options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2471
def button(value = nil, options = {}, &block)
  value, options = nil, value if value.is_a?(Hash)
  value ||= submit_default_value
  @template.button_tag(value, options, &block)
end

Добавить кнопку отправки для данной формы. Если значение не указано, проверяется, является ли объект новым ресурсом или нет, чтобы создать соответствующую метку:

<%= form_for @post do |f| %>
  <%= f.button %>
<% end %>

В примере выше, если @post является новой записью, будет использоваться «Создать пост» в качестве метки кнопки; в противном случае используется «Обновить пост».

Эти метки можно настроить с помощью I18n по ключу helpers.submit (такой же, как и у вспомогательного метода submit) и используя %{model} для интерполяции перевода:

en:
  helpers:
    submit:
      create: "Create a %{model}"
      update: "Confirm changes to %{model}"

Он также ищет ключ, специфичный для данного объекта:

en:
  helpers:
    submit:
      post:
        create: "Add %{model}"

Примеры

button("Create post")
# => <button name='button' type='submit'>Create post</button>

button do
  content_tag(:strong, 'Ask me!')
end
# => <button name='button' type='submit'>
#      <strong>Ask me!</strong>
#    </button>
check_box(method, options = {}, checked_value = "1", unchecked_value = "0") Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2313
def check_box(method, options = {}, checked_value = "1", unchecked_value = "0")
  @template.check_box(@object_name, method, objectify_options(options), checked_value, unchecked_value)
end

Возвращает тег флажка, предназначенный для доступа к указанному атрибуту (определенному как method) объекта, назначенного шаблону (определенному как object). Этот объект должен быть объектом экземпляра (@object), а не локальным объектом. Предполагается, что method возвращает целое число, и если это целое число больше нуля, то флажок установлен. Дополнительные параметры тега input могут быть переданы в виде хеша с options. Значение по умолчанию для checked_value равно 1, а значение по умолчанию для unchecked_value установлено на 0, что удобно для булевых значений.

Загвоздка

Спецификация HTML гласит, что невыбранные флажки не являются успешными, и поэтому веб-браузеры не отправляют их. К сожалению, это создает загвоздку: если модель Invoice имеет флаг paid, и в форме, которая редактирует оплаченный счет-фактуру, пользователь снимает флажок, параметр paid не отправляется. Таким образом, любая идиома массового присваивания, такая как

@invoice.update(params[:invoice])

не будет обновлять флаг.

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

Таким образом, клиент либо отправляет только скрытое поле (представляющее собой невыбранный флажок), либо оба поля. Поскольку спецификация HTML гласит, что пары ключ/значение должны быть отправлены в том же порядке, в котором они появляются в форме, а извлечение параметров получает последнее вхождение любого повторяющегося ключа в строке запроса, это работает для обычных форм.

К сожалению, этот обходной путь не работает, когда флажок находится внутри параметра, подобного массиву, как в

<%= fields_for "project[invoice_attributes][]", invoice, index: nil do |form| %>
  <%= form.check_box :paid %>
  ...
<% end %>

потому что повторение имени параметра — это именно то, что Rails стремится отличить элементы массива. Для каждого элемента с установленным флажком вы получаете дополнительный фиктивный элемент только с этим атрибутом, присвоенным «0».

В этом случае предпочтительнее использовать check_box_tag или использовать хеши вместо массивов.

# Let's say that @post.validated? is 1:
check_box("validated")
# => <input name="post[validated]" type="hidden" value="0" />
#    <input checked="checked" type="checkbox" id="post_validated" name="post[validated]" value="1" />

# Let's say that @puppy.gooddog is "no":
check_box("gooddog", {}, "yes", "no")
# => <input name="puppy[gooddog]" type="hidden" value="no" />
#    <input type="checkbox" id="puppy_gooddog" name="puppy[gooddog]" value="yes" />

# Let's say that @eula.accepted is "no":
check_box("accepted", { class: 'eula_check' }, "yes", "no")
# => <input name="eula[accepted]" type="hidden" value="no" />
#    <input type="checkbox" class="eula_check" id="eula_accepted" name="eula[accepted]" value="yes" />
collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 879
def collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
  @template.collection_check_boxes(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options), &block)
end

Оборачивает ActionView::Helpers::FormOptionsHelper#collection_check_boxes для строителей форм:

<%= form_for @post do |f| %>
  <%= f.collection_check_boxes :author_ids, Author.all, :id, :name_with_initial %>
  <%= f.submit %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 891
def collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block)
  @template.collection_radio_buttons(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options), &block)
end

Оборачивает ActionView::Helpers::FormOptionsHelper#collection_radio_buttons для строителей форм:

<%= form_for @post do |f| %>
  <%= f.collection_radio_buttons :author_id, Author.all, :id, :name_with_initial %>
  <%= f.submit %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

collection_select(method, collection, value_method, text_method, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 843
def collection_select(method, collection, value_method, text_method, options = {}, html_options = {})
  @template.collection_select(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_options.merge(html_options))
end

Оборачивает ActionView::Helpers::FormOptionsHelper#collection_select для строителей форм:

<%= form_for @post do |f| %>
  <%= f.collection_select :person_id, Author.all, :id, :name_with_initial, prompt: true %>
  <%= f.submit %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

color_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1735
      

Оборачивает ActionView::Helpers::FormHelper#color_field для строителей форм:

<%= form_with model: @user do |f| %>
  <%= f.color_field :favorite_color %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

date_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1787
      

Оборачивает ActionView::Helpers::FormHelper#date_field для строителей форм:

<%= form_with model: @user do |f| %>
  <%= f.date_field :born_on %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

date_select(method, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/date_helper.rb, line 1171
def date_select(method, options = {}, html_options = {})
  @template.date_select(@object_name, method, objectify_options(options), html_options)
end

Оборачивает ActionView::Helpers::DateHelper#date_select для строителей форм:

<%= form_for @person do |f| %>
  <%= f.date_select :birth_date %>
  <%= f.submit %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

datetime_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1813
      

Оборачивает ActionView::Helpers::FormHelper#datetime_field для строителей форм:

<%= form_with model: @user do |f| %>
  <%= f.datetime_field :graduation_day %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

datetime_local_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1826
      

Оборачивает ActionView::Helpers::FormHelper#datetime_local_field для строителей форм:

<%= form_with model: @user do |f| %>
  <%= f.datetime_local_field :graduation_day %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

datetime_select(method, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/date_helper.rb, line 1195
def datetime_select(method, options = {}, html_options = {})
  @template.datetime_select(@object_name, method, objectify_options(options), html_options)
end

Оборачивает ActionView::Helpers::DateHelper#datetime_select для строителей форм:

<%= form_for @person do |f| %>
  <%= f.datetime_select :last_request_at %>
  <%= f.submit %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

email_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1878
      

Оборачивает ActionView::Helpers::FormHelper#email_field для строителей форм:

<%= form_with model: @user do |f| %>
  <%= f.email_field :address %>
<% end %>

Обратитесь к документации базового помощника для получения подробной информации.

fields(scope = nil, model: nil, **options, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2195
def fields(scope = nil, model: nil, **options, &block)
  options[:allow_method_names_outside_object] = true
  options[:skip_default_ids] = !FormHelper.form_with_generates_ids

  convert_to_legacy_options(options)

  fields_for(scope || model, model, options, &block)
end

См. документацию для вспомогательного метода ActionView::FormHelper.fields.

fields_for(record_name, record_object = nil, fields_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2157
def fields_for(record_name, record_object = nil, fields_options = {}, &block)
  fields_options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options?
  fields_options[:builder] ||= options[:builder]
  fields_options[:namespace] = options[:namespace]
  fields_options[:parent_builder] = self

  case record_name
  when String, Symbol
    if nested_attributes_association?(record_name)
      return fields_for_with_nested_attributes(record_name, record_object, fields_options, block)
    end
  else
    record_object = record_name.is_a?(Array) ? record_name.last : record_name
    record_name   = model_name_from_record_or_class(record_object).param_key
  end

  object_name = @object_name
  index = if options.has_key?(:index)
    options[:index]
  elsif defined?(@auto_index)
    object_name = object_name.to_s.sub(/\[\]$/, "")
    @auto_index
  end

  record_name = if index
    "#{object_name}[#{index}][#{record_name}]"
  elsif record_name.to_s.end_with?("[]")
    record_name = record_name.to_s.sub(/(.*)\[\]$/, "[\\1][#{record_object.id}]")
    "#{object_name}#{record_name}"
  else
    "#{object_name}[#{record_name}]"
  end
  fields_options[:child_index] = index

  @template.fields_for(record_name, record_object, fields_options, &block)
end

Создаёт область видимости вокруг конкретного объекта модели, как form_for, но не создаёт сами теги формы. Это делает #fields_for подходящим для указания дополнительных объектов модели в одной форме.

Хотя использование и назначение fields_for аналогично form_for, его сигнатура метода немного отличается. Как и form_for, он передаёт объект FormBuilder, связанный с определённым объектом модели, в блок, и внутри блока разрешает вызывать методы на билдере для генерации полей, связанных с объектом модели. Поля могут отражать объект модели двумя способами — как они названы (а следовательно, как представленные значения отображаются в params хэше в контроллере) и какие значения по умолчанию отображаются, когда форма с полями отображается впервые. Для того, чтобы оба этих свойства можно было указывать независимо, как имя объекта (представленное символом или строкой), так и сам объект могут передаваться в метод отдельно —

<%= form_for @person do |person_form| %>
  First name: <%= person_form.text_field :first_name %>
  Last name : <%= person_form.text_field :last_name %>

  <%= fields_for :permission, @person.permission do |permission_fields| %>
    Admin?  : <%= permission_fields.check_box :admin %>
  <% end %>

  <%= person_form.submit %>
<% end %>

В этом случае поле флажка будет представлено тегом HTML input с атрибутом name permission[admin], а переданное значение будет отображаться в контроллере как params[:permission][:admin]. Если @person.permission является существующей записью с атрибутом admin, начальное состояние флажка при первом отображении будет отражать значение @person.permission.admin.

Часто это можно упростить, передав только имя объекта модели в fields_for —

<%= fields_for :permission do |permission_fields| %>
  Admin?: <%= permission_fields.check_box :admin %>
<% end %>

…в этом случае, если :permission также является именем переменной экземпляра @permission, начальное состояние поля ввода будет отражать значение атрибута этой переменной @permission.admin.

В качестве альтернативы, вы можете передать только сам объект модели (если первый аргумент не является строкой или символом fields_for поймёт, что имя опущено) —

<%= fields_for @person.permission do |permission_fields| %>
  Admin?: <%= permission_fields.check_box :admin %>
<% end %>

и fields_for выведет необходимое имя поля из класса объекта модели, например, если @person.permission, является экземпляром класса Permission, поле всё равно будет именоваться permission[admin].

Примечание: Это также работает для методов в FormOptionsHelper и DateHelper, которые предназначены для работы с объектом в качестве базы, как ActionView::Helpers::FormOptionsHelper#collection_select и ActionView::Helpers::DateHelper#datetime_select.

Примеры вложенных атрибутов

Когда объект, принадлежащий текущей области видимости, имеет метод записи вложенного атрибута для определённого атрибута, #fields_for создаст новую область видимости для этого атрибута. Это позволяет создавать формы, которые устанавливают или изменяют атрибуты родительского объекта и его ассоциаций за один раз.

Методы записи вложенных атрибутов — это обычные методы установки, названные в честь ассоциации. Наиболее распространённый способ определения этих методов — либо с помощью accepts_nested_attributes_for в определении модели, либо путём определения метода с соответствующим именем. Например: метод записи атрибута для ассоциации :address называется address_attributes=.

Будет ли сгенерирован билдер формы типа один-к-одному или один-ко-многим, зависит от того, возвращает ли нормальный метод чтения один объект или массив объектов.

Один-к-одному

Рассмотрим класс Person, который возвращает один объект Address из метода чтения address и отвечает на метод записи address_attributes=:

class Person
  def address
    @address
  end

  def address_attributes=(attributes)
    # Process the attributes hash
  end
end

Теперь эта модель может использоваться с вложенным #fields_for, например так:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :address do |address_fields| %>
    Street  : <%= address_fields.text_field :street %>
    Zip code: <%= address_fields.text_field :zip_code %>
  <% end %>
  ...
<% end %>

Если address уже является ассоциацией в Person, вы можете использовать accepts_nested_attributes_for для определения метода записи за вас:

class Person < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address
end

Если вы хотите удалить связанную модель через форму, сначала необходимо включить эту возможность, используя параметр :allow_destroy для accepts_nested_attributes_for:

class Person < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address, allow_destroy: true
end

Теперь, когда вы используете элемент формы с параметром _destroy со значением, которое оценивается как true, вы удалите связанную модель (например, 1, '1', true или 'true'):

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :address do |address_fields| %>
    ...
    Delete: <%= address_fields.check_box :_destroy %>
  <% end %>
  ...
<% end %>

Один-ко-многим

Рассмотрим класс Person, который возвращает массив объектов Project из метода чтения projects и отвечает на метод записи projects_attributes=:

class Person
  def projects
    [@project1, @project2]
  end

  def projects_attributes=(attributes)
    # Process the attributes hash
  end
end

Обратите внимание, что метод записи projects_attributes= фактически необходим для того, чтобы #fields_for правильно идентифицировал :projects как коллекцию и правильно устанавливал индексы в разметке формы.

Если projects уже является ассоциацией в Person, вы можете использовать accepts_nested_attributes_for для определения метода записи за вас:

class Person < ActiveRecord::Base
  has_many :projects
  accepts_nested_attributes_for :projects
end

Теперь эту модель можно использовать с вложенным fields_for. Блок, переданный вызову вложенного #fields_for, будет повторяться для каждого экземпляра в коллекции:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects do |project_fields| %>
    <% if project_fields.object.active? %>
      Name: <%= project_fields.text_field :name %>
    <% end %>
  <% end %>
  ...
<% end %>

Также возможно указать используемый экземпляр:

<%= form_for @person do |person_form| %>
  ...
  <% @person.projects.each do |project| %>
    <% if project.active? %>
      <%= person_form.fields_for :projects, project do |project_fields| %>
        Name: <%= project_fields.text_field :name %>
      <% end %>
    <% end %>
  <% end %>
  ...
<% end %>

Или использовать коллекцию:

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects, @active_projects do |project_fields| %>
    Name: <%= project_fields.text_field :name %>
  <% end %>
  ...
<% end %>

Если вы хотите удалить любые связанные модели через форму, сначала необходимо включить эту возможность, используя параметр :allow_destroy для accepts_nested_attributes_for:

class Person < ActiveRecord::Base
  has_many :projects
  accepts_nested_attributes_for :projects, allow_destroy: true
end

Это позволит вам указать, какие модели нужно удалить в хэше атрибутов, добавив элемент формы для параметра _destroy со значением, которое оценивается как true (например, 1, '1', true или 'true'):

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects do |project_fields| %>
    Delete: <%= project_fields.check_box :_destroy %>
  <% end %>
  ...
<% end %>

Если используется коллекция, вам может понадобиться узнать индекс каждого объекта в массиве. Для этой цели в объекте FormBuilder доступен метод index.

<%= form_for @person do |person_form| %>
  ...
  <%= person_form.fields_for :projects do |project_fields| %>
    Project #<%= project_fields.index %>
    ...
  <% end %>
  ...
<% end %>

Обратите внимание, что #fields_for автоматически сгенерирует скрытое поле для хранения идентификатора записи. Есть случаи, когда это скрытое поле не нужно, и вы можете передать include_id: false чтобы предотвратить автоматическое отображение #fields_for его.

file_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2395
def file_field(method, options = {})
  self.multipart = true
  @template.file_field(@object_name, method, objectify_options(options))
end

Возвращает тег ввода для загрузки файла, настроенный для доступа к указанному атрибуту (определяемому method) объекта, назначенного шаблону (определяемому object). Дополнительные параметры тега ввода можно передать как хэш с options. Эти параметры будут добавлены в HTML в виде атрибутов элемента HTML, как показано в примере.

Использование этого метода внутри блока form_for установит кодировку окружающей формы на multipart/form-data.

Параметры

  • Создаёт стандартные атрибуты HTML для тега.

  • :disabled — Если установлено в true, пользователь не сможет использовать этот элемент ввода.

  • :multiple — Если установлено в true, *в большинстве современных браузеров* пользователю будет разрешено выбрать несколько файлов.

  • :accept — Если установлено в один или несколько MIME-типов, пользователю будет предложен фильтр при выборе файла. Вам всё равно нужно настроить валидацию модели.

Примеры

# Let's say that @user has avatar:
file_field(:avatar)
# => <input type="file" id="user_avatar" name="user[avatar]" />

# Let's say that @post has image:
file_field(:image, :multiple => true)
# => <input type="file" id="post_image" name="post[image][]" multiple="multiple" />

# Let's say that @post has attached:
file_field(:attached, accept: 'text/html')
# => <input accept="text/html" type="file" id="post_attached" name="post[attached]" />

# Let's say that @post has image:
file_field(:image, accept: 'image/png,image/gif,image/jpeg')
# => <input type="file" id="post_image" name="post[image]" accept="image/png,image/gif,image/jpeg" />

# Let's say that @attachment has file:
file_field(:file, class: 'file_input')
# => <input type="file" id="attachment_file" name="attachment[file]" class="file_input" />
grouped_collection_select(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 855
def grouped_collection_select(method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {})
  @template.grouped_collection_select(@object_name, method, collection, group_method, group_label_method, option_key_method, option_value_method, objectify_options(options), @default_html_options.merge(html_options))
end

Оборачивает ActionView::Helpers::FormOptionsHelper#grouped_collection_select для билдеров форм:

<%= form_for @city do |f| %>
  <%= f.grouped_collection_select :country_id, @continents, :countries, :name, :id, :name %>
  <%= f.submit %>
<% end %>

Для получения подробностей обратитесь к документации базового помощника.

hidden_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2357
def hidden_field(method, options = {})
  @emitted_hidden_id = true if method == :id
  @template.hidden_field(@object_name, method, objectify_options(options))
end

Возвращает тег скрытого поля ввода, настроенный для доступа к указанному атрибуту (определяемому method) объекта, назначенного шаблону (определяемому object). Дополнительные параметры тега ввода можно передать как хэш с options. Эти параметры будут добавлены в HTML в виде атрибутов элемента HTML, как показано в примере.

Примеры

# Let's say that @signup.pass_confirm returns true:
hidden_field(:pass_confirm)
# => <input type="hidden" id="signup_pass_confirm" name="signup[pass_confirm]" value="true" />

# Let's say that @post.tag_list returns "blog, ruby":
hidden_field(:tag_list)
# => <input type="hidden" id="post_tag_list" name="post[tag_list]" value="blog, ruby" />

# Let's say that @user.token returns "abcde":
hidden_field(:token)
# => <input type="hidden" id="user_token" name="user[token]" value="abcde" />
label(method, text = nil, options = {}, &block) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 2252
def label(method, text = nil, options = {}, &block)
  @template.label(@object_name, method, text, objectify_options(options), &block)
end

Возвращает тег label, предназначенный для маркировки поля ввода для указанного атрибута (идентифицированного как method) объекта, назначенного шаблону (идентифицированного как object). Текст метки будет по умолчанию соответствовать имени атрибута, если только перевод не будет найден в текущей локали I18n (через helpers.label.<modelname>.<attribute>) или вы не укажете его явно. Дополнительные параметры тега label могут быть переданы в виде хэша с options. Эти параметры будут добавлены в HTML в качестве атрибута элемента HTML, как показано в примере, за исключением параметра :value, который предназначен для целевых меток для тегов #radio_button (где значение используется в ID тега ввода).

Примеры

label(:title)
# => <label for="post_title">Title</label>

Вы можете локализовать ваши метки на основе имен модели и атрибута. Например, вы можете определить следующее в вашей локали (например, en.yml)

helpers:
  label:
    post:
      body: "Write your entire text here"

Что затем приведет к

label(:body)
# => <label for="post_body">Write your entire text here</label>

Локализация также может быть основана чисто на переводе имени атрибута (если вы используете ActiveRecord):

activerecord:
  attributes:
    post:
      cost: "Total cost"

label(:cost)
# => <label for="post_cost">Total cost</label>

label(:title, "A short title")
# => <label for="post_title">A short title</label>

label(:title, "A short title", class: "title_label")
# => <label for="post_title" class="title_label">A short title</label>

label(:privacy, "Public Post", value: "public")
# => <label for="post_privacy_public">Public Post</label>

label(:terms) do
  raw('Accept <a href="/terms">Terms</a>.')
end
# => <label for="post_terms">Accept <a href="/terms">Terms</a>.</label>
month_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1839
      

Оборачивает ActionView::Helpers::FormHelper#month_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.month_field :birthday_month %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

multipart=(multipart) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1643
def multipart=(multipart)
  @multipart = multipart

  if parent_builder = @options[:parent_builder]
    parent_builder.multipart = multipart
  end
end
number_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1891
      

Оборачивает ActionView::Helpers::FormHelper#number_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.number_field :age %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

password_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1709
      

Оборачивает ActionView::Helpers::FormHelper#password_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.password_field :password %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

phone_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1774
      

Оборачивает ActionView::Helpers::FormHelper#phone_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.phone_field :phone %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

radio_button(method, tag_value, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 2335
def radio_button(method, tag_value, options = {})
  @template.radio_button(@object_name, method, tag_value, objectify_options(options))
end

Возвращает тег радиокнопки для доступа к указанному атрибуту (идентифицированному как method) объекта, назначенного шаблону (идентифицированному как object). Если текущее значение method равно tag_value, радиокнопка будет выбрана.

Чтобы принудительно установить флажок радиокнопки, передайте checked: true в хэше options. Вы также можете передать параметры HTML.

# Let's say that @post.category returns "rails":
radio_button("category", "rails")
radio_button("category", "java")
# => <input type="radio" id="post_category_rails" name="post[category]" value="rails" checked="checked" />
#    <input type="radio" id="post_category_java" name="post[category]" value="java" />

# Let's say that @user.receive_newsletter returns "no":
radio_button("receive_newsletter", "yes")
radio_button("receive_newsletter", "no")
# => <input type="radio" id="user_receive_newsletter_yes" name="user[receive_newsletter]" value="yes" />
#    <input type="radio" id="user_receive_newsletter_no" name="user[receive_newsletter]" value="no" checked="checked" />
range_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1904
      

Оборачивает ActionView::Helpers::FormHelper#range_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.range_field :age %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

rich_text_area(method, options = {}) Show source
# File actiontext/app/helpers/action_text/tag_helper.rb, line 75
def rich_text_area(method, options = {})
  @template.rich_text_area(@object_name, method, objectify_options(options))
end
search_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1748
      

Оборачивает ActionView::Helpers::FormHelper#search_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.search_field :name %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

select(method, choices = nil, options = {}, html_options = {}, &block) Show source
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 831
def select(method, choices = nil, options = {}, html_options = {}, &block)
  @template.select(@object_name, method, choices, objectify_options(options), @default_html_options.merge(html_options), &block)
end

Оборачивает ActionView::Helpers::FormOptionsHelper#select для конструкторов форм:

<%= form_for @post do |f| %>
  <%= f.select :person_id, Person.all.collect { |p| [ p.name, p.id ] }, include_blank: true %>
  <%= f.submit %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

submit(value = nil, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 2427
def submit(value = nil, options = {})
  value, options = nil, value if value.is_a?(Hash)
  value ||= submit_default_value
  @template.submit_tag(value, options)
end

Добавляет кнопку отправки для данной формы. Если значение не указано, проверяется, является ли объект новым ресурсом или нет, для создания соответствующей метки:

<%= form_for @post do |f| %>
  <%= f.submit %>
<% end %>

В примере выше, если @post является новой записью, будет использоваться «Создать пост» в качестве метки кнопки отправки; в противном случае используется «Обновить пост».

Эти метки можно настроить с помощью I18n по ключу helpers.submit и используя %{model} для интерполяции перевода:

en:
  helpers:
    submit:
      create: "Create a %{model}"
      update: "Confirm changes to %{model}"

Он также ищет ключ, специфичный для данного объекта:

en:
  helpers:
    submit:
      post:
        create: "Add %{model}"
telephone_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1761
      

Оборачивает ActionView::Helpers::FormHelper#telephone_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.telephone_field :phone %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

text_area(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1722
      

Оборачивает ActionView::Helpers::FormHelper#text_area для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.text_area :detail %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

text_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1696
      

Оборачивает ActionView::Helpers::FormHelper#text_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.text_field :name %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

time_field(method, options = {}) Show source
# File actionview/lib/action_view/helpers/form_helper.rb, line 1800
      

Оборачивает ActionView::Helpers::FormHelper#time_field для конструкторов форм:

<%= form_with model: @user do |f| %>
  <%= f.time_field :borned_at %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

time_select(method, options = {}, html_options = {}) Show source
# File actionview/lib/action_view/helpers/date_helper.rb, line 1183
def time_select(method, options = {}, html_options = {})
  @template.time_select(@object_name, method, objectify_options(options), html_options)
end

Оборачивает ActionView::Helpers::DateHelper#time_select для конструкторов форм:

<%= form_for @race do |f| %>
  <%= f.time_select :average_lap %>
  <%= f.submit %>
<% end %>

Пожалуйста, обратитесь к документации базового помощника для получения подробной информации.

time_zone_select(method, priority_zones = nil, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 867
def time_zone_select(method, priority_zones = nil, options = {}, html_options = {})
  @template.time_zone_select(@object_name, method, priority_zones, objectify_options(options), @default_html_options.merge(html_options))
end

Оборачивает ActionView::Helpers::FormOptionsHelper#time_zone_select для билдеров форм:

<%= form_for @user do |f| %>
  <%= f.time_zone_select :time_zone, nil, include_blank: true %>
  <%= f.submit %>
<% end %>

Для получения подробностей обратитесь к документации базового помощника.

to_model() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1659
def to_model
  self
end
to_partial_path() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1655
def to_partial_path
  self.class._to_partial_path
end
url_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1865
      

Оборачивает ActionView::Helpers::FormHelper#url_field для билдеров форм:

<%= form_with model: @user do |f| %>
  <%= f.url_field :homepage %>
<% end %>

Для получения подробностей обратитесь к документации базового помощника.

week_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1852
      

Оборачивает ActionView::Helpers::FormHelper#week_field для билдеров форм:

<%= form_with model: @user do |f| %>
  <%= f.week_field :birthday_week %>
<% end %>

Для получения подробностей обратитесь к документации базового помощника.

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

Spec-Zone.ru

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