早期要建立表單的時候,還會依照是否已建立 model 來選擇 form 的方法,在尚未建立任何 model 的時後,通常會使用 form_tag 來製作較為簡單形式的表單。
<%= form_tag users_path do %>
<%= text_field_tag :email %>
<%= submit_tag %>
<% end %>
當專案有建立好的 Model 時,就會使用 form_for
<%= form_for @user do |f| %>
<%= f.text_field :email %>
<%= f.submit %>
<% end %>
因為本文不討論form_tag,所以就大概提到這邊…
更多內容請參考form_for @ Rails API
直到 Ruby 版本更新到 5.1 之後出現了 form_with。form_with 結合了form_tag 和 form_for 的功能,所以接下來不管在有無 Model 的情況下都可以直接使用。
沒有 Model 時候的 form_with
<%= form_with url: users_path do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
有 Model 時候的 form_with
<%= form_with model: @user do |form| %>
<%= form.text_field :email %>
<%= form.submit %>
<% end %>
form_with 選項
:model:使用model後會自動會表單加上url和scope
:scope:用來為表單中的欄位增加namespace的prefix
:method:get . post . patch . put . delete
:format:設定要求回傳的檔案型態
:authenticity_token
:local:如果不希望使用 remote: true ,可以加上 local: true
更多內容請參考form_with @ Rails API
在爬文時有看到別人寫說 form_with 之後會完全取代 form_tag 和 form_for,所以不久後只會留下 form_with?關於這件事的真假,就再觀察啦!
參考連結:
[Rails] Action View Form Helpers
[Rails 5.1] 'form_with' APIドキュメント完全翻訳