不論是哪種程式語言,都會很常用到表單(Form)。
今天就來簡單的介紹一下rails有哪些幫忙建立表單的幫手吧!
Let's 走!
據說,很久很久以前,是有在用 form_tag 這個語法建立form的,
通常是在沒有要使用特定 Model 時使用的。
只需要在erb檔案裡寫下:
<%= form_tag do %>
This A Form
<% end %>
Rails 會自動幫你翻譯長出下面這串東西:
<form action="/member/show" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓" />
<input type="hidden" name="authenticity_token" value="UgefBstVew/QQcuSk7rmjCByQBSvHPfmENYM096Je0ltEY9ileVA0YCrS1NigCgI5Yv4R/dlIt5q85RxrTI3sg==" />
This A Form
</form>
其中:
第一個 name 屬性為 utf8 的 input,強制瀏覽器正確採用表單指定的編碼。
第二個 name 屬性為 authenticity_token 的 input,
是 Rails 內建用來防止 CSRF (cross-site request forgery protection) 攻擊的安全機制。
簡單來說就是:欺騙使用者的瀏覽器,讓其以使用者的名義執行操作。
接下來是 form_for,剛剛說 form_tag 是沒有配合特定Model在使用語法,
那當然就會有要配合特定 Model 物件的用法啦!
通常這時候,我們會在 Controller 裡,透過 Model 來建立物件:
#app/controllers/products_controller.rb
def new
@product = Product.new
end
然後會在對應的erb檔裡,用form_for語法來建立表單:
app/views/products/nw.html.rb
<%= form_for(@product) do |form| %>
<%= form.input :name %>
<%= form.input :price %>
<%= form.input :description %>
<%= form.input :is_available %>
<%= form.submit class: 'btn btn-success' %>
<% end %>
很麻煩吶,一下子form_tag,一下子form_for的,
有木有懶人包,兩種情況都能使用的語法啊?!
有有有當然有:form_with就是Rails 5.1設計推出的新的語法:
沒有 Model 時候的 form_with
<%= form_with url:posts_path do |form| %>
<%= form.text_field :name %>
<%= form.submit %>
<% end %>
有 Model 時候的 form_with
<%= form_with model: @post do |form| %>
<%= form.text_field :name %>
<%= form.submit %>
<% end %>
什麼?你說我還有很多細節沒有說?
說好是簡單介紹的吼!!
好啦,補一下參考資料。
就將,先來補個普拿疼去...
跨站請求偽造
Action View 表單輔助方法
FormHelper