Spec-Zone.ru › Ruby on Rails 7.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 1683
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 1695
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&.end_with?("[]")
    if (object ||= @template.instance_variable_get("@#{@object_name[0..-3]}")) && 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 = {}) { |value| ... } Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2609
def button(value = nil, options = {}, &block)
  case value
  when Hash
    value, options = nil, value
  when Symbol
    value, options = nil, { name: field_name(value), id: field_id(value) }.merge!(options.to_h)
  end
  value ||= submit_default_value

  if block_given?
    value = @template.capture { yield(value) }
  end

  formmethod = options[:formmethod]
  if formmethod.present? && !/post|get/i.match?(formmethod) && !options.key?(:name) && !options.key?(:value)
    options.merge! formmethod: :post, name: "_method", value: formmethod
  end

  @template.button_tag(value, options)
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(:draft, value: true)
# => <button id="post_draft" name="post[draft]" value="true" type="submit">Create post</button>

button do
  content_tag(:strong, 'Ask me!')
end
# => <button name='button' type='submit'>
#      <strong>Ask me!</strong>
#    </button>

button do |text|
  content_tag(:strong, text)
end
# => <button name='button' type='submit'>
#      <strong>Create post</strong>
#    </button>

button(:draft, value: true) do
  content_tag(:strong, "Save as draft")
end
# =>  <button id="post_draft" name="post[draft]" value="true" type="submit">
#       <strong>Save as draft</strong>
#     </button>
check_box(method, options = {}, checked_value = "1", unchecked_value = "0") Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2433
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 для тега, например :class.

  • :checked - true или false принудительно устанавливает состояние флажка как установленное или нет.

  • :include_hidden - Если установлено в false, вспомогательное скрытое поле, описанное ниже, не будет создано.

Подвох

Спецификация 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 905
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 917
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 857
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 1818
      

Оборачивает 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 1870
      

Оборачивает 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 1225
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 1896
      

Оборачивает 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 1909
      

Оборачивает 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 1249
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 1961
      

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

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

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

field_id(method, *suffixes, namespace: @options[:namespace], index: @index) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1752
def field_id(method, *suffixes, namespace: @options[:namespace], index: @index)
  @template.field_id(@object_name, method, *suffixes, namespace: namespace, index: index)
end

Генерирует значение атрибута HTML id для данного поля

Возвращает значение, сгенерированное FormBuilder для данного имени атрибута.

<%= form_for @post do |f| %>
  <%= f.label :title %>
  <%= f.text_field :title, aria: { describedby: f.field_id(:title, :error) } %>
  <%= tag.span("is blank", id: f.field_id(:title, :error) %>
<% end %>

В примере выше, элемент <input type="text">, созданный вызовом FormBuilder#text_field, объявляет атрибут aria-describedby, ссылающийся на элемент <span>, имеющий общий корень id (post_title, в данном случае).

field_name(method, *methods, multiple: false, index: @index) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1772
def field_name(method, *methods, multiple: false, index: @index)
  object_name = @options.fetch(:as) { @object_name }

  @template.field_name(object_name, method, *methods, index: index, multiple: multiple)
end

Генерирует значение атрибута HTML name для заданной комбинации имени и поля.

Возвращает значение, сгенерированное FormBuilder для заданного имени атрибута.

<%= form_for @post do |f| %>
  <%= f.text_field :title, name: f.field_name(:title, :subtitle) %>
  <%# => <input type="text" name="post[title][subtitle]">
<% end %>

<%= form_for @post do |f| %>
  <%= f.field_tag :tag, name: f.field_name(:tag, multiple: true) %>
  <%# => <input type="text" name="post[tag][]">
<% end %>
fields(scope = nil, model: nil, **options, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2289
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 2252
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 = @template._object_for_form_builder(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.delete_suffix("[]")
    @auto_index
  end

  record_name = if index
    "#{object_name}[#{index}][#{record_name}]"
  elsif record_name.end_with?("[]")
    "#{object_name}[#{record_name[0..-3]}][#{record_object.id}]"
  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, он передаёт объект 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, которые предназначены для работы с объектом в качестве основы, например, FormOptionsHelper#collection_select и 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 как коллекцию и установить правильные индексы в разметке формы.

Если 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 2516
def file_field(method, options = {})
  self.multipart = true
  @template.file_field(@object_name, method, objectify_options(options))
end

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

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

Параметры

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

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

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

  • :include_hidden — Когда multiple: true и include_hidden: true, поле будет предваряться полем <input type="hidden"> с пустым значением для поддержки отправки пустой коллекции файлов.

  • :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 869
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 2477
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" />
id() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1732
def id
  options.dig(:html, :id)
end

Генерирует значение атрибута HTML id.

возвращает атрибут id элемента <form>.

<%= form_for @post do |f| %>
  <%# ... %>

  <% content_for :sticky_footer do %>
    <%= form.button(form: f.id) %>
  <% end %>
<% end %>

В приведенном выше примере область содержимого :sticky_footer будет существовать за пределами элемента <form>. Объявляя атрибут HTML form, мы указываем браузеру, что сгенерированный элемент <button> должен рассматриваться как кнопка отправки элемента <form>, независимо от того, где он находится в DOM.

label(method, text = nil, options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2364
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(:cost) do |translation|
  content_tag(:span, translation, class: "cost_label")
end
# => <label for="post_cost"><span class="cost_label">Total cost</span></label>

label(:cost) do |builder|
  content_tag(:span, builder.translation, class: "cost_label")
end
# => <label for="post_cost"><span class="cost_label">Total cost</span></label>

label(:cost) do |builder|
  content_tag(:span, builder.translation, class: [
    "cost_label",
    ("error_label" if builder.object.errors.include?(:cost))
  ])
end
# => <label for="post_cost"><span class="cost_label error_label">Total cost</span></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 = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1922
      

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

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

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

multipart=(multipart) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1675
def multipart=(multipart)
  @multipart = multipart

  if parent_builder = @options[:parent_builder]
    parent_builder.multipart = multipart
  end
end
number_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1974
      

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

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

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

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

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

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

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

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

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

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

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

radio_button(method, tag_value, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 2455
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 = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1987
      

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

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

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

rich_text_area(method, options = {}) Показать исходный код
# File actiontext/app/helpers/action_text/tag_helper.rb, line 93
def rich_text_area(method, options = {})
  @template.rich_text_area(@object_name, method, objectify_options(options))
end
search_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1831
      

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

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

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

select(method, choices = nil, options = {}, html_options = {}, &block) Показать исходный код
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 845
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 2548
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 = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1844
      

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

time_select(method, options = {}, html_options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/date_helper.rb, line 1237
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 881
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 1691
def to_model
  self
end
to_partial_path() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1687
def to_partial_path
  self.class._to_partial_path
end
url_field(method, options = {}) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1948
      

Оборачивает 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 1935
      

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

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

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

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

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

<%= form_for @user do |f| %>
  <%= f.weekday_select :weekday, include_blank: true %>
  <%= f.submit %>
<% end %>

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

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

Spec-Zone.ru

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