你必須很努力

Rails 在建立表單的時候,form_for 跟 form_with 有什麼不同?

2019/09/14
字數統計: 497閱讀時間: 2 min

在 Rails 5.1 之前,Rails 提供了form_forform_tag。 (無 form_with 喔) 簡單說下form_forform_tag的功能:

  1. form_for處理 Model 物件
  2. form_tag處理簡單的表單 Rails 5.1 之後,form_with取代了form_forform_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還有三個特色:

  1. id、class、data 的屬性免花括號 form_tagform_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| %>

  1. 自動生成 id、calss 在 Rails 5.1 版本的form_with不會自動產生 id、class,需由開發者自行指定;Rails 5.2 之後,則改回和form_tagform_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>

  1. 預設以 remote 傳送 預設由 Ajax 傳送,在沒有form_with的年代,form_forform_tag會需要多下一條remote: true指令,如需修改預設值,輸入 local: true。

1
<%= form_with model: @user, local: true do |form| %>

聽完有沒有覺得 form_with 好棒棒,替我們省下一些事情 XD 相信不久的將來,由 form_with 取代,指日可待~~


參考:

  1. Rails 5.1’s form_with vs. form_tag vs. form_for
  2. form_with — Building HTML forms in Rails 5.1
  3. USING FORM_WITH VS FORM_FOR VS FORM_TAG
  4. 在 Rails 使用 JavaScript
CATALOG