about 1 year ago

'form_for'是一个helper用于生成HTML的表单,'do \f\'中的'|f|' 为 'form builder'表单生成器

form_for用来将表单绑定到对象上,从而快速地添加需要编辑的对象的属性。

<%= form_for @article, url: { action: "create" }, html: { class: "nifty_form" } do |f| %>
<%= f.text_field :title %>
<%= f.text_area :body, size: "60x12" %>
<%= f.submit "Created" %>
<% end %>
@article 是要编辑的对象
form_for 方法的参数只有一个Hash,各种选项均为嵌套Hash,如url(表单提交的地址),method(表单提交方法),html(表单html属性),namespace(命名空间,将其值作为前缀添加到id属性上)
form_for 方法会拽入一个表单构造器对象—f变量
生成表单控件的帮助方法在表单构造器对象f上调用

详解:
2.2 将表单绑定至对象

当 Person 有很多属性时,我们得一直重复传入 :person 来生成对应的表单。 Rails 提供了 form_for 让你把表单绑定至 model 的对象。

假设我们有个处理文章的 controller:app/controllers/articles_controller.rb:

def new
@article = Article.new
end

对应的 view app/views/articles/new.html.erb:

<%= form_for @article, url: {action: "create"}, html: {class: "nifty_form"} do |f| %>
<%= f.text_field :title %>
<%= f.text_area :body, size: "60x12" %>
<%= f.submit "Create" %>
<% end %>

几件事情要说明一下:

@article 是实际被编辑的对象。
有两个 options (hash)::url 与 :html。还可传入 :namespace,用来生成独一无二的 ID。
|f| 为 form builder。
本来写成 text_field(:article) 改为 f.text_filed。
生成的 HTML 为:

<form accept-charset="UTF-8" action="/articles/create" method="post" class="nifty_form">
<input id="article_title" name="article[title]" type="text" />
<textarea id="article_body" name="article[body]" cols="60" rows="12"></textarea>
<input name="commit" type="submit" value="Create" />
</form>

除了 form builder,还有个 fields_for 可用。这在使用相同表单,来编辑多个 model 对象的场合下很有用。比如你有个 Person model,有一个与之关联的 ContactDetail model,则可生成可同时编辑两个 model 的表单:

<%= form_for @person, url: {action: "create"} do |person_form| %>
<%= person_form.text_field :name %>
<%= fields_for @person.contact_detail do |contact_details_form| %>
<%= contact_details_form.text_field :phone_number %>
<% end %>
<% end %>

会生成:

<form accept-charset="UTF-8" action="/people/create" class="new_person" id="new_person" method="post">
<input id="person_name" name="person[name]" type="text" />
<input id="contact_detail_phone_number" name="contact_detail[phone_number]" type="text" />
</form>

← 什么时候用col-sm,md,lg?