Action View 表单构建器¶ ↑
一个 FormBuilder 对象与一个特定的模型对象关联,并允许你生成与该模型对象相关的字段。当你使用 form_with 或 fields_for 时,FormBuilder 对象会被yield。例如:
<%= form_with model: @person do |person_form| %> Name: <%= person_form.text_field :name %> Admin: <%= person_form.checkbox :admin %> <% end %>
在上面的代码块中,一个 FormBuilder 对象作为 person_form 变量被yield。这允许你通过调用相应的方法(如 text_field 和 checkbox)来生成字段,这些方法会修改底层模板并将 @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 包裹在新创建的 radio button 周围。请注意,当传递选项时,你必须调用 objectify_options 才能使模型对象正确地传递给方法。如果未调用 objectify_options,则新创建的辅助方法将不会与模型关联。
上面代码中的 div_radio_button 方法现在可以这样使用:
<%= form_with model: @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 类属性中。
- #
- B
- C
- D
- E
- F
- G
- H
- I
- L
- M
- N
- P
- R
- S
- T
- U
- W
Attributes
| [R] | 索引 | |
| [R] | multipart | |
| [R] | multipart? | |
| [RW] | object | |
| [RW] | object_name | |
| [RW] | options |
类公共方法
_to_partial_path() 链接
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1708 def self._to_partial_path @_to_partial_path ||= name.demodulize.underscore.sub!(/_builder$/, "") end
new(object_name, object, template, options) 链接
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1720 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 = {}, &block) 链接
为给定的表单添加提交按钮。当未提供值时,它会检查对象是否是新资源,以创建适当的标签。
<%= form_with model: @article do |f| %> <%= f.button %> <% end %>
在上面的示例中,如果 @article 是一个新记录,按钮标签将是“Create Article”;否则,它将是“Update Article”。
这些标签可以使用 I18n 在 helpers.submit 键下进行自定义(与 submit 辅助方法相同),并使用 %{model} 进行翻译插值。
en:
helpers:
submit:
create: "Create a %{model}"
update: "Confirm changes to %{model}"
它还会查找与给定对象相关的特定键。
en:
helpers:
submit:
article:
create: "Add %{model}"
示例¶ ↑
button("Create article") # => <button name='button' type='submit'>Create article</button> button(:draft, value: true) # => <button id="article_draft" name="article[draft]" value="true" type="submit">Create article</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 article</strong> # </button> button(:draft, value: true) do content_tag(:strong, "Save as draft") end # => <button id="article_draft" name="article[draft]" value="true" type="submit"> # <strong>Save as draft</strong> # </button>
源码: 显示 | 在 GitHub 上
checkbox(method, options = {}, checked_value = "1", unchecked_value = "0") 链接
返回一个专门用于访问模板中指定对象(由 object 标识)的特定属性(由 method 标识)的复选框标签。此对象必须是实例对象(@object),而不是局部对象。通常,method 返回一个整数,如果该整数大于零,则复选框被选中。可以通过 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.checkbox :paid %> ... <% end %>
因为参数名称重复正是 Rails 试图区分数组元素的方式。对于每个已勾选的复选框项,你会得到一个额外的“幽灵”项,只包含该属性,并分配给“0”。
在这种情况下,最好使用 FormTagHelper#checkbox_tag 或使用哈希而不是数组。
示例¶ ↑
# Let's say that @article.validated? is 1: checkbox("validated") # => <input name="article[validated]" type="hidden" value="0" /> # <input checked="checked" type="checkbox" id="article_validated" name="article[validated]" value="1" /> # Let's say that @puppy.gooddog is "no": checkbox("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": checkbox("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" />
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 2473 def checkbox(method, options = {}, checked_value = "1", unchecked_value = "0") @template.checkbox(@object_name, method, objectify_options(options), checked_value, unchecked_value) end
collection_check_boxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block) 链接
collection_checkboxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block) 链接
封装了 ActionView::Helpers::FormOptionsHelper#collection_checkboxes 以用于表单构建器。
<%= form_with model: @post do |f| %> <%= f.collection_checkboxes :author_ids, Author.all, :id, :name_with_initial %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 911 def collection_checkboxes(method, collection, value_method, text_method, options = {}, html_options = {}, &block) @template.collection_checkboxes(@object_name, method, collection, value_method, text_method, objectify_options(options), @default_html_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_with model: @post do |f| %> <%= f.collection_radio_buttons :author_id, Author.all, :id, :name_with_initial %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
collection_select(method, collection, value_method, text_method, options = {}, html_options = {}) 链接
封装了 ActionView::Helpers::FormOptionsHelper#collection_select 以用于表单构建器。
<%= form_with model: @post do |f| %> <%= f.collection_select :person_id, Author.all, :id, :name_with_initial, prompt: true %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 863 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
color_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#color_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.color_field :favorite_color %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1843
date_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#date_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.date_field :born_on %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1895
date_select(method, options = {}, html_options = {}) 链接
封装了 ActionView::Helpers::DateHelper#date_select 以用于表单构建器。
<%= form_with model: @person do |f| %> <%= f.date_select :birth_date %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/date_helper.rb, line 1261 def date_select(method, options = {}, html_options = {}) @template.date_select(@object_name, method, objectify_options(options), html_options) end
datetime_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#datetime_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.datetime_field :graduation_day %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1921
datetime_local_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#datetime_local_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.datetime_local_field :graduation_day %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1934
datetime_select(method, options = {}, html_options = {}) 链接
封装了 ActionView::Helpers::DateHelper#datetime_select 以用于表单构建器。
<%= form_with model: @person do |f| %> <%= f.datetime_select :last_request_at %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/date_helper.rb, line 1285 def datetime_select(method, options = {}, html_options = {}) @template.datetime_select(@object_name, method, objectify_options(options), html_options) end
email_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#email_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.email_field :address %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1986
field_id(method, *suffixes, namespace: @options[:namespace], index: @options[:index]) 链接
为给定的字段生成一个 HTML id 属性值。
返回 FormBuilder 为给定属性名称生成的值。
<%= form_with model: @article 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 %>
在上面的示例中,通过调用 text_field 生成的 <input type="text"> 元素声明了一个引用 <span> 元素的 aria-describedby 属性,共享一个通用的 id 根(在此例中为 article_title)。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1777 def field_id(method, *suffixes, namespace: @options[:namespace], index: @options[:index]) @template.field_id(@object_name, method, *suffixes, namespace: namespace, index: index) end
field_name(method, *methods, multiple: false, index: @options[:index]) 链接
为给定的名称和字段组合生成一个 HTML name 属性值。
返回 FormBuilder 为给定属性名称生成的值。
<%= form_with model: @article do |f| %> <%= f.text_field :title, name: f.field_name(:title, :subtitle) %> <%# => <input type="text" name="article[title][subtitle]"> %> <% end %> <%= form_with model: @article do |f| %> <%= f.text_field :tag, name: f.field_name(:tag, multiple: true) %> <%# => <input type="text" name="article[tag][]"> %> <% end %>
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1797 def field_name(method, *methods, multiple: false, index: @options[:index]) object_name = @options.fetch(:as) { @object_name } @template.field_name(object_name, method, *methods, index: index, multiple: multiple) end
fields(scope = nil, model: nil, **options, &block) 链接
请参阅 ActionView::Helpers::FormHelper#fields 辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 2327 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
fields_for(record_name, record_object = nil, fields_options = nil, &block) 链接
围绕一个特定的模型对象创建一个作用域,类似于 form_with,但不创建表单标签本身。这使得 fields_for 适用于在同一个表单中指定额外的模型对象。
虽然 fields_for 的用法和目的与 form_with 相似,但其方法签名略有不同。与 form_with 一样,它将一个与特定模型对象关联的 FormBuilder 对象 yield 给一个块,并在块内允许在构建器上调用方法来生成与模型对象相关的字段。字段可以通过两种方式反映模型对象——它们被命名(因此提交的值会出现在控制器中的 params 哈希中)以及当表单字段首次显示时显示的默认值。为了能够独立指定这两个功能,可以向方法分别传递一个对象名称(由符号或字符串表示)和对象本身——
<%= form_with model: @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.checkbox :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.checkbox :admin %> <% end %>
…在这种情况下,如果 :permission 也恰好是实例变量 @permission 的名称,则输入字段的初始状态将反映该变量的属性 @permission.admin 的值。
或者,你可以只传递模型对象本身(如果第一个参数不是字符串或符号,fields_for 将意识到名称已被省略)——
<%= fields_for @person.permission do |permission_fields| %> Admin?: <%= permission_fields.checkbox :admin %> <% end %>
然后 fields_for 将从模型对象的 *类* 中派生出必需的字段名称,例如,如果 @person.permission 的类是 Permission,则字段仍将命名为 permission[admin]。
注意:这对于 FormOptionsHelper 和 DateHelper 中设计用于以对象为基础的方法也同样有效,例如 FormOptionsHelper#collection_select 和 DateHelper#datetime_select。
fields_for 会尝试智能地处理参数,但当同时提供名称和值参数,并且提供的值的形状是选项 Hash 时,它可能会混淆。为了消除歧义,请显式传递一个选项 Hash,即使是空的。
<%= form_with model: @person do |person_form| %>
...
<%= fields_for :permission, @person.permission, {} do |permission_fields| %>
Admin?: <%= checkbox_tag permission_fields.field_name(:admin), @person.permission[:admin] %>
<% end %>
...
<% end %>
嵌套属性示例¶ ↑
当当前作用域的对象具有某个属性的嵌套属性写入器时,fields_for 将为该属性 yield 一个新的作用域。这允许你创建同时设置或更改父对象及其关联属性的表单。
嵌套属性写入器是命名为关联名称的普通设置器方法。定义这些写入器的最常见方式是在模型定义中使用 accepts_nested_attributes_for 或定义一个具有正确名称的方法。例如:关联 :address 的属性写入器称为 address_attributes=。
将 yield 一对一还是一个对多的表单构建器取决于正常的读取器方法返回的是一个 *单个* 对象还是一个 *数组* 的对象。
一对一¶ ↑
考虑一个 Person 类,它通过 address 读取器方法返回一个 *单个* Address 对象,并响应 address_attributes= 写入器方法。
class Person def address @address end def address_attributes=(attributes) # Process the attributes hash end end
此模型现在可以与嵌套的 fields_for 一起使用,如下所示:
<%= form_with model: @person do |person_form| %>
...
<%= person_form.fields_for :address do |address_fields| %>
Street : <%= address_fields.text_field :street %>
Zip code: <%= address_fields.text_field :zip_code %>
<% end %>
...
<% end %>
当 address 已经是 Person 的关联时,你可以使用 accepts_nested_attributes_for 来为你定义写入器方法。
class Person < ActiveRecord::Base has_one :address accepts_nested_attributes_for :address end
如果你想通过表单销毁关联的模型,你必须首先使用 accepts_nested_attributes_for 的 :allow_destroy 选项来启用它。
class Person < ActiveRecord::Base has_one :address accepts_nested_attributes_for :address, allow_destroy: true end
现在,当你使用带有 _destroy 参数的表单元素,并且其值为 true 时,你将销毁关联的模型(例如 1、'1'、true 或 'true')。
<%= form_with model: @person do |person_form| %>
...
<%= person_form.fields_for :address do |address_fields| %>
...
Delete: <%= address_fields.checkbox :_destroy %>
<% end %>
...
<% end %>
一对多¶ ↑
考虑一个 Person 类,它通过 projects 读取器方法返回一个 *Project* 实例的 *数组*,并响应 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_with model: @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_with model: @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_with model: @person do |person_form| %>
...
<%= person_form.fields_for :projects, @active_projects do |project_fields| %>
Name: <%= project_fields.text_field :name %>
<% end %>
...
<% end %>
如果你想通过表单销毁任何关联的模型,你必须首先使用 accepts_nested_attributes_for 的 :allow_destroy 选项来启用它。
class Person < ActiveRecord::Base has_many :projects accepts_nested_attributes_for :projects, allow_destroy: true end
这将允许你通过添加一个值为 true 的 _destroy 参数的表单元素(例如 1、'1'、true 或 'true')来指定要销毁哪些模型。
<%= form_with model: @person do |person_form| %>
...
<%= person_form.fields_for :projects do |project_fields| %>
Delete: <%= project_fields.checkbox :_destroy %>
<% end %>
...
<% end %>
当使用集合时,你可能想知道数组中每个对象的索引。为此,index 方法在 FormBuilder 对象中可用。
<%= form_with model: @person do |person_form| %>
...
<%= person_form.fields_for :projects do |project_fields| %>
Project #<%= project_fields.index %>
...
<% end %>
...
<% end %>
注意,fields_for 将自动生成一个隐藏字段来存储记录的 ID。在某些情况下,此隐藏字段不需要,你可以传递 include_id: false 来防止 fields_for 自动渲染它。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 2289 def fields_for(record_name, record_object = nil, fields_options = nil, &block) fields_options, record_object = record_object, nil if fields_options.nil? && record_object.is_a?(Hash) && record_object.extractable_options? fields_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
file_field(method, options = {}) 链接
返回一个文件上传输入标签,专门用于访问模板中指定对象(由 object 标识)的特定属性(由 method 标识)。可以通过 options 哈希传递附加的输入标签选项。这些选项将作为 HTML 元素属性添加到 HTML 中,如示例所示。
在 form_with 块中使用此方法会将封闭表单的编码设置为 multipart/form-data。
选项¶ ↑
-
为标签创建标准的 HTML 属性。
-
:disabled- 如果设置为 true,用户将无法使用此输入。 -
:multiple- 如果设置为 true,*在大多数更新的浏览器中*,用户将被允许选择多个文件。 -
:include_hidden- 当multiple: true和include_hidden: true时,字段将以一个空的<input type="hidden">字段作为前缀,以支持提交一个空文件集合。由于include_hidden如果你不指定include_hidden,将默认为config.active_storage.multiple_file_field_include_hidden,因此当你传递multiple: true时,你需要传递include_hidden: false来阻止提交一个空文件集合。 -
: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 @article has image: file_field(:image, :multiple => true) # => <input type="file" id="article_image" name="article[image][]" multiple="multiple" /> # Let's say that @article has attached: file_field(:attached, accept: 'text/html') # => <input accept="text/html" type="file" id="article_attached" name="article[attached]" /> # Let's say that @article has image: file_field(:image, accept: 'image/png,image/gif,image/jpeg') # => <input type="file" id="article_image" name="article[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" />
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 2557 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_with model: @city do |f| %> <%= f.grouped_collection_select :country_id, @continents, :countries, :name, :id, :name %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 875 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
hidden_field(method, options = {}) 链接
返回一个隐藏输入标签,专门用于访问模板中指定对象(由 object 标识)的特定属性(由 method 标识)。可以通过 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 @article.tag_list returns "blog, ruby": hidden_field(:tag_list) # => <input type="hidden" id="article_tag_list" name="article[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" />
源码: | 在 GitHub 上
id() 链接
生成一个 HTML id 属性值。
返回 <form> 元素的 id 属性。
<%= form_with model: @article do |f| %>
<%# ... %>
<% content_for :sticky_footer do %>
<%= form.button(form: f.id) %>
<% end %>
<% end %>
在上面的示例中,:sticky_footer 内容区域将存在于 <form> 元素之外。通过声明 form HTML 属性,我们向浏览器提示生成的 <button> 元素应被视为 <form> 元素的提交按钮,无论它在 DOM 中的位置如何。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1757 def id options.dig(:html, :id) || options[:id] end
label(method, text = nil, options = {}, &block) 链接
返回一个标签标签,专门用于标记模板中指定对象(由 object 标识)的特定属性(由 method 标识)的输入字段。标签文本默认为属性名称,除非在当前 I18n 区域设置中找到翻译(通过 helpers.label.<modelname>.<attribute>)或你明确指定。附加的标签选项可以通过 options 哈希传递。这些选项将作为 HTML 元素属性添加到 HTML 中,如示例所示,但 :value 选项除外,该选项旨在用于 radio_button 标签的标签(其中值用于输入标签的 ID)。
示例¶ ↑
label(:title) # => <label for="article_title">Title</label>
你可以根据模型和属性名称本地化你的标签。例如,你可以在你的区域设置(例如 en.yml)中定义以下内容:
helpers:
label:
article:
body: "Write your entire text here"
这将产生:
label(:body) # => <label for="article_body">Write your entire text here</label>
本地化也可以仅基于属性名称的翻译(如果你使用 ActiveRecord)。
activerecord:
attributes:
article:
cost: "Total cost"
label(:cost) # => <label for="article_cost">Total cost</label> label(:title, "A short title") # => <label for="article_title">A short title</label> label(:title, "A short title", class: "title_label") # => <label for="article_title" class="title_label">A short title</label> label(:privacy, "Public Article", value: "public") # => <label for="article_privacy_public">Public Article</label> label(:cost) do |translation| content_tag(:span, translation, class: "cost_label") end # => <label for="article_cost"><span class="cost_label">Total cost</span></label> label(:cost) do |builder| content_tag(:span, builder.translation, class: "cost_label") end # => <label for="article_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="article_cost"><span class="cost_label error_label">Total cost</span></label> label(:terms) do raw('Accept <a href="/terms">Terms</a>.') end # => <label for="article_terms">Accept <a href="/terms">Terms</a>.</label>
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 2404 def label(method, text = nil, options = {}, &block) @template.label(@object_name, method, text, objectify_options(options), &block) end
month_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#month_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.month_field :birthday_month %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1947
multipart=(multipart) 链接
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1700 def multipart=(multipart) @multipart = multipart if parent_builder = @options[:parent_builder] parent_builder.multipart = multipart end end
number_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#number_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.number_field :age %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1999
password_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#password_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.password_field :password %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1817
phone_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#phone_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.phone_field :phone %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1882
radio_button(method, tag_value, options = {}) 链接
返回一个单选按钮标签,用于访问模板中指定对象(由 object 标识)的特定属性(由 method 标识)。如果 method 的当前值为 tag_value,则单选按钮将被选中。
要强制单选按钮被选中,请在 options 哈希中传递 checked: true。你也可以在那里传递 HTML 选项。
# Let's say that @article.category returns "rails": radio_button("category", "rails") radio_button("category", "java") # => <input type="radio" id="article_category_rails" name="article[category]" value="rails" checked="checked" /> # <input type="radio" id="article_category_java" name="article[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" />
源码: 显示 | 在 GitHub 上
range_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#range_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.range_field :age %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 2012
rich_textarea(method, options = {}, &block) 链接
封装了 ActionView::Helpers::FormHelper#rich_textarea 以用于表单构建器。
<%= form_with model: @message do |f| %> <%= f.rich_textarea :content %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actiontext/app/helpers/action_text/tag_helper.rb, line 114 def rich_textarea(method, options = {}, &block) @template.rich_textarea(@object_name, method, objectify_options(options), &block) end
search_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#search_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.search_field :name %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1856
select(method, choices = nil, options = {}, html_options = {}, &block) 链接
封装了 ActionView::Helpers::FormOptionsHelper#select 以用于表单构建器。
<%= form_with model: @post do |f| %>
<%= f.select :person_id, Person.all.collect { |p| [ p.name, p.id ] }, include_blank: true %>
<%= f.submit %>
<% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 851 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
submit(value = nil, options = {}) 链接
为给定的表单添加提交按钮。当未提供值时,它会检查对象是否是新资源,以创建适当的标签。
<%= form_with model: @article do |f| %> <%= f.submit %> <% end %>
在上面的示例中,如果 @article 是一个新记录,按钮标签将是“Create Article”;否则,它将是“Update Article”。
这些标签可以使用 I18n 在 helpers.submit 键下进行自定义,并使用 %{model} 进行翻译插值。
en:
helpers:
submit:
create: "Create a %{model}"
update: "Confirm changes to %{model}"
它还会查找与给定对象相关的特定键。
en:
helpers:
submit:
article:
create: "Add %{model}"
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 2589 def submit(value = nil, options = {}) value, options = nil, value if value.is_a?(Hash) value ||= submit_default_value @template.submit_tag(value, options) end
telephone_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#telephone_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.telephone_field :phone %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1869
text_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#text_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.text_field :name %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1804
textarea(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#textarea 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.textarea :detail %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1830
time_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#time_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.time_field :born_at %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1908
time_select(method, options = {}, html_options = {}) 链接
封装了 ActionView::Helpers::DateHelper#time_select 以用于表单构建器。
<%= form_with model: @race do |f| %> <%= f.time_select :average_lap %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/date_helper.rb, line 1273 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_with model: @user do |f| %> <%= f.time_zone_select :time_zone, nil, include_blank: true %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 887 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
to_model() 链接
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1716 def to_model self end
to_partial_path() 链接
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1712 def to_partial_path self.class._to_partial_path end
url_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#url_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.url_field :homepage %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1973
week_field(method, options = {}) 链接
封装了 ActionView::Helpers::FormHelper#week_field 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.week_field :birthday_week %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 在 GitHub 上
# File actionview/lib/action_view/helpers/form_helper.rb, line 1960
weekday_select(method, options = {}, html_options = {}) 链接
封装了 ActionView::Helpers::FormOptionsHelper#weekday_select 以用于表单构建器。
<%= form_with model: @user do |f| %> <%= f.weekday_select :weekday, include_blank: true %> <%= f.submit %> <% end %>
有关详细信息,请参阅基础辅助方法的文档。
源码: 显示 | 在 GitHub 上
# File actionview/lib/action_view/helpers/form_options_helper.rb, line 899 def weekday_select(method, options = {}, html_options = {}) @template.weekday_select(@object_name, method, objectify_options(options), @default_html_options.merge(html_options)) end