在 Rails 5.1 之前,Rails 提供了form_for
和form_tag
。 (無 form_with 喔)
簡單說下form_for
和form_tag
的功能:
form_for
處理 Model 物件form_tag
處理簡單的表單 Rails 5.1 之後,form_with
取代了form_for
和form_tag
。 有 Model 的話:
1
2
3<%= form_with model: Message.new do |form| %>
<%= form.text_field :username %>
<% end %>
產生如下:
1
2
3<form action="/messages" method="post" data-remote="true">
<input type="text" name="message[username]">
</form>
指定 URL 時:
1
2
3<%= form_with url: messages_path do |form| %>
<%= form.text_field :username %>
<% end %>
產生如下:
1
2
3<form action="/messages" method="post" data-remote="true">
<input type="text" name="username">
</form>
可用 scope 添加前綴:
1
2
3<%= form_with scope: :post, url: posts_path do |form| %>
<%= form.text_field :username %>
<% end %>
產生如下:
1
2
3<form action="/posts" method="post" data-remote="true">
<input type="text" name="post[username]">
</form>
form_with
還有三個特色:
- id、class、data 的屬性免花括號
form_tag
、form_for
使用 HTML 的 id、class、data 屬性時,需使用 { } 包起來:
1
<%= form_for @user, html: { id: "custom-id", class: "custom-class" } do |form| %>
form_with
寫法:
1
<%= form_with model: @user, id: "custom-id", class: "custom-class" do |form| %>
- 自動生成 id、calss
在 Rails 5.1 版本的
form_with
不會自動產生 id、class,需由開發者自行指定;Rails 5.2 之後,則改回和form_tag
、form_for
一樣,自動附加 id、class。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<%= form_with User.new do |form| %>
<%= form.text_field :username %>
<% end %>
# Rails 5.1:
<form action="/users">
<input type="text" name="user[username]" />
</form>
# Rails 5.2:
<form class="new_user" id="new_user" action="/users">
<input type="text" name="user[username]" id="user_username" />
</form>
- 預設以 remote 傳送
預設由 Ajax 傳送,在沒有
form_with
的年代,form_for
和form_tag
會需要多下一條remote: true
指令,如需修改預設值,輸入 local: true。
1
<%= form_with model: @user, local: true do |form| %>
聽完有沒有覺得 form_with 好棒棒,替我們省下一些事情 XD 相信不久的將來,由 form_with 取代,指日可待~~
參考: