Spec-Zone.ru › Ruby on Rails 4.1

class ActionView::Helpers::FormBuilder

Родительский класс:
Object
Включенные модули:
ActionView::ModelNaming

Объект 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

Приведённый выше код создаёт новый метод 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 1228
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 1240
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) : {}
  if @object_name.to_s.match(/\[\]$/)
    if object ||= @template.instance_variable_get("@#{Regexp.last_match.pre_match}") and 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) Показать исходный код

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

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

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

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

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

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

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

Примеры

button("Create a 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>
# File actionview/lib/action_view/helpers/form_helper.rb, line 1793
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
check_box(method, options = {}, checked_value = "1", unchecked_value = "0") Показать исходный код

Возвращает тег флажка, предназначенный для доступа к указанному атрибуту (определяется 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("post", "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("puppy", "gooddog", {}, "yes", "no")
# => <input name="puppy[gooddog]" type="hidden" value="no" />
#    <input type="checkbox" id="puppy_gooddog" name="puppy[gooddog]" value="yes" />

check_box("eula", "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" />
# File actionview/lib/action_view/helpers/form_helper.rb, line 1644
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
collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block) Показать исходный код

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

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

# File actionview/lib/action_view/helpers/form_options_helper.rb, line 824
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_options.merge(html_options), &block)
end
collection_radio_buttons(method, collection, value_method, text_method, options = {}, html_options = {}, &block) Показать исходный код

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

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

# File actionview/lib/action_view/helpers/form_options_helper.rb, line 836
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_options.merge(html_options), &block)
end
collection_select(method, collection, value_method, text_method, options = {}, html_options = {}) Показать исходный код

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

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

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

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

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

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

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

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

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

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

# File actionview/lib/action_view/helpers/date_helper.rb, line 1089
def datetime_select(method, options = {}, html_options = {})
  @template.datetime_select(@object_name, method, objectify_options(options), html_options)
end
emitted_hidden_id?() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1799
def emitted_hidden_id?
  @emitted_hidden_id ||= nil
end
fields_for(record_name, record_object = nil, fields_options = {}, &block) Показать исходный код

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

Хотя использование и назначение field_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].

Примечание: это также работает для методов в FormOptionHelper и DateHelper, которые предназначены для работы с объектом в качестве основы, например, FormOptionHelper#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 как коллекцию, и правильно установить индексы в разметке формы.

Если 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 actionview/lib/action_view/helpers/form_helper.rb, line 1508
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

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

  record_name = index ? "#{object_name}[#{index}][#{record_name}]" : "#{object_name}[#{record_name}]"
  fields_options[:child_index] = index

  @template.fields_for(record_name, record_object, fields_options, &block)
end
file_field(method, options = {}) Показать исходный код

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

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

Параметры

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

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

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

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

Примеры

file_field(:user, :avatar)
# => <input type="file" id="user_avatar" name="user[avatar]" />

file_field(:post, :image, :multiple => true)
# => <input type="file" id="post_image" name="post[image]" multiple="true" />

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

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

file_field(:attachment, :file, class: 'file_input')
# => <input type="file" id="attachment_file" name="attachment[file]" class="file_input" />
# File actionview/lib/action_view/helpers/form_helper.rb, line 1717
def file_field(method, options = {})
  self.multipart = true
  @template.file_field(@object_name, method, objectify_options(options))
end
grouped_collection_select(method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {}) Показать исходный код

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

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

# File actionview/lib/action_view/helpers/form_options_helper.rb, line 800
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_options.merge(html_options))
end
hidden_field(method, options = {}) Показать исходный код

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

Примеры

hidden_field(:signup, :pass_confirm)
# => <input type="hidden" id="signup_pass_confirm" name="signup[pass_confirm]" value="#{@signup.pass_confirm}" />

hidden_field(:post, :tag_list)
# => <input type="hidden" id="post_tag_list" name="post[tag_list]" value="#{@post.tag_list}" />

hidden_field(:user, :token)
# => <input type="hidden" id="user_token" name="user[token]" value="#{@user.token}" />
# File actionview/lib/action_view/helpers/form_helper.rb, line 1684
def hidden_field(method, options = {})
  @emitted_hidden_id = true if method == :id
  @template.hidden_field(@object_name, method, objectify_options(options))
end
label(method, text = nil, options = {}, &block) Показать исходный код

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

Примеры

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

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

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

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

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

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

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

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

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

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

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

label(:post, :terms) do
  'Accept <a href="/terms">Terms</a>.'.html_safe
end
# File actionview/lib/action_view/helpers/form_helper.rb, line 1584
def label(method, text = nil, options = {}, &block)
  @template.label(@object_name, method, text, objectify_options(options), &block)
end
multipart=(multipart) Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1220
def multipart=(multipart)
  @multipart = multipart

  if parent_builder = @options[:parent_builder]
    parent_builder.multipart = multipart
  end
end
radio_button(method, tag_value, options = {}) Показать исходный код

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

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

# Let's say that @post.category returns "rails":
radio_button("post", "category", "rails")
radio_button("post", "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" />

radio_button("user", "receive_newsletter", "yes")
radio_button("user", "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" />
# File actionview/lib/action_view/helpers/form_helper.rb, line 1665
def radio_button(method, tag_value, options = {})
  @template.radio_button(@object_name, method, tag_value, objectify_options(options))
end
select(method, choices = nil, options = {}, html_options = {}, &block) Показать исходный код

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

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

# File actionview/lib/action_view/helpers/form_options_helper.rb, line 776
def select(method, choices = nil, options = {}, html_options = {}, &block)
  @template.select(@object_name, method, choices, objectify_options(options), @default_options.merge(html_options), &block)
end
submit(value=nil, options={}) Показать исходный код

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

<%= 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}"
# File actionview/lib/action_view/helpers/form_helper.rb, line 1749
def submit(value=nil, options={})
  value, options = nil, value if value.is_a?(Hash)
  value ||= submit_default_value
  @template.submit_tag(value, options)
end
time_select(method, options = {}, html_options = {}) Показать исходный код

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

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

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

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

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

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

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

# File actionview/lib/action_view/helpers/form_options_helper.rb, line 812
def time_zone_select(method, priority_zones = nil, options = {}, html_options = {})
  @template.time_zone_select(@object_name, method, priority_zones, objectify_options(options), @default_options.merge(html_options))
end
to_model() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1236
def to_model
  self
end
to_partial_path() Показать исходный код
# File actionview/lib/action_view/helpers/form_helper.rb, line 1232
def to_partial_path
  self.class._to_partial_path
end

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

Spec-Zone.ru

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