class 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 Приведённый выше код создаёт новый метод 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.
Атрибуты
Открытые методы класса
# 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
# 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 Открытые методы экземпляра
Добавить кнопку отправки для данной формы. Если значение не указано, проверяется, является ли объект новым ресурсом, для создания соответствующей подписи:
<%= 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 Возвращает тег флажка, предназначенный для доступа к указанному атрибуту (определяется 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 Оборачивает 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 Оборачивает 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 Оборачивает 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 Оборачивает 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 Оборачивает 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 Создаёт область видимости вокруг конкретного объекта модели, подобно 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 Возвращает тег ввода для загрузки файлов, настроенный для доступа к указанному атрибуту (определённому 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 Оборачивает 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 Возвращает тег скрытого поля ввода, настроенный для доступа к указанному атрибуту (определяемому 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}" />
Возвращает тег метки, предназначенный для маркировки поля ввода для указанного атрибута (определяемого 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 # 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 Возвращает тег радиокнопки для доступа к указанному атрибуту (определяемому 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 Оборачивает 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 Добавляет кнопку отправки для данной формы. Если значение не указано, проверяет, является ли объект новым ресурсом или нет, чтобы создать правильную метку:
<%= 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 Оборачивает 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 Оборачивает 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 # File actionview/lib/action_view/helpers/form_helper.rb, line 1236 def to_model self end
# 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.