Spec-Zone.ru › Ruby on Rails 5.2

класс 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 1645
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 1657
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 2244
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 2086
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 возвращает целое число, и если это целое число больше нуля, то флажок установлен. Дополнительные параметры тега ввода могут быть переданы в виде хэша с 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 870
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 882
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 834
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 %>

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

date_select(method, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/date_helper.rb, line 1127
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_select(method, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/date_helper.rb, line 1151
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 %>

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

emitted_hidden_id?() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2250
def emitted_hidden_id?
  @emitted_hidden_id ||= nil
end
fields(scope = nil, model: nil, **options, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1968
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 1930
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 %>

Если адрес уже является ассоциацией в 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 как коллекцию, и установить правильные индексы в разметке формы.

Если проекты уже являются ассоциацией в 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 автоматически сгенерирует скрытое поле для хранения ID записи. В некоторых случаях это скрытое поле не требуется, и вы можете передать include_id: false чтобы предотвратить автоматическое отображение #fields_for.

file_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2168
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 846
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 2130
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) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2025
def label(method, text = nil, options = {}, &block)
  @template.label(@object_name, method, text, objectify_options(options), &block)
end

Возвращает тег метки, настроенный для маркировки поля ввода для указанного атрибута (определенного как method) объекта, присвоенного шаблону (определенного как object). Текст метки по умолчанию равен имени атрибута, если в текущем локали I18n (через helpers.label.<modelname>.<attribute>) не найдено перевода, или вы явно его не укажете. Дополнительные параметры тега метки могут быть переданы в виде хэша с 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>
multipart=(multipart) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1637
def multipart=(multipart)
  @multipart = multipart

  if parent_builder = @options[:parent_builder]
    parent_builder.multipart = multipart
  end
end
radio_button(method, tag_value, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2108
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" />
select(method, choices = nil, options = {}, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 822
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 = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2200
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}"
time_select(method, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/date_helper.rb, line 1139
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 858
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 1653
def to_model
  self
end
to_partial_path() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1649
def to_partial_path
  self.class._to_partial_path
end

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

Spec-Zone.ru

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